NSThread

在 iOS/macOS 开发中,NSThread 是用于处理多线程操作的基础类,startcancelmain 是其核心方法,各自承担不同职责:

1. start() 方法

  • 作用:启动线程,将线程从 "新建" 状态切换到 "就绪" 状态,等待系统调度执行。

  • 执行流程 :调用 start() 后,系统会在合适时机调用线程的 main() 方法(线程的入口点)。

  • 注意

    • 一个线程对象只能调用一次 start(),重复调用会导致异常。
    • 调用后线程并非立即执行,而是进入系统的线程调度队列,等待 CPU 分配时间片。

2. main() 方法

  • 作用:线程的主执行函数,线程启动后实际运行的代码逻辑都在这里。

  • 使用方式

    • 通常需要子类化 NSThread 并重写 main() 方法,在其中实现具体任务。
    • 也可以通过 NSThread 的初始化方法(如 initWithTarget:selector:object:)指定要执行的方法,替代重写 main()
  • 注意

    • main() 方法执行完毕后,线程会进入 "终止" 状态。
    • 若在 main() 中处理耗时任务,需定期检查线程是否被取消(见 cancel 方法),以便及时退出。

3. cancel() 方法

  • 作用:标记线程为 "取消" 状态,但不会立即终止线程。

  • 工作原理

    • 仅设置线程的 isCancelled 属性为 YES,不会主动中断线程的执行。
    • 需要在 main() 方法中主动检查 isCancelled 状态,若为 YES 则手动退出任务,实现线程终止。
  • 示例

    objective-c

    less 复制代码
    // 子类化 NSThread 并重写 main
    @interface MyThread : NSThread
    @end
    
    @implementation MyThread
    - (void)main {
        // 模拟耗时任务,定期检查是否被取消
        for (int i = 0; i < 1000; i++) {
            // 检查取消状态,若已取消则退出
            if (self.isCancelled) {
                NSLog(@"线程被取消,退出执行");
                return;
            }
            NSLog(@"执行第 %d 步", i);
            [NSThread sleepForTimeInterval:0.1]; // 模拟耗时
        }
    }
    @end
    
    // 使用线程
    MyThread *thread = [[MyThread alloc] init];
    [thread start]; // 启动线程
    
    // 一段时间后取消线程
    [thread cancel];

总结

  • start():启动线程,触发 main() 执行。
  • main():线程的核心逻辑执行处,需包含具体任务代码。
  • cancel():标记线程为取消状态,需配合 isCancelled 检查实现线程退出。
相关推荐
白玉cfc24 分钟前
【iOS】折叠cell
ios·objective-c
2501_9159090624 分钟前
uni-app iOS 性能监控与调试全流程:多工具协作的实战案例
android·ios·小程序·https·uni-app·iphone·webview
他们都不看好你,偏偏你最不争气26 分钟前
【iOS】MVC架构
前端·ios·mvc·objective-c·面向对象
willlzq1 小时前
KeyPath:从OC到Swift有哪些改变?
ios
专注VB编程开发20年2 小时前
js检测浏览器环境UA,微信浏览器,安卓浏览器,IOS设备
ios·ua·微信浏览器·安卓浏览器
AI2中文网14 小时前
别再说AppInventor2只能开发安卓了!苹果iOS现已支持!
android·ios·跨平台·苹果·appstore·app inventor 2·appinventor
咕噜签名分发冰淇淋14 小时前
苹果ipa应用安装包ios系统闪退问题
macos·ios·cocoa
wsxlgg14 小时前
IOS打包上传 出现 You do not have required contracts to perform an operation 的解决办法
ios