NSThread

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

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 检查实现线程退出。
相关推荐
疯狂敲代码的老刘14 小时前
d2r-mobile:3.2千星开源暗黑破坏神2 iOS兼容层,3天冲上GitHub日榜
ios·github
黑科技iOS上架1 天前
App Store5.6隐藏功能究竟怎么排查?
ios·审核
Yannik1 天前
iOS Swift Package Manager(SPM)私有组件完整实操
ios·swift
随遇丿而安1 天前
第 4 周:28KB 的 PNG 占了 8MB 内存,因为图片内存看尺寸不看文件大小
ios
leizhen198408091 天前
Vibe Coding:门槛降了,但判断力成了新的门槛
人工智能·安全·ios
我就是不信1 天前
Swift 方法派发机制详解
开发语言·ios·swift
AIsoft_86892 天前
科会通录音工具倍速回放怎么切换速度
ios·智能手机
老李IT笔记2 天前
设备显示在线但指令没回执:三类静默失效的排查顺序
ios·iphone
芯械研究所2 天前
她宁、益博思、倍思、绿联哪款ipad电容笔好?四款电容笔款式实测解读
ios·ipad·电容笔·电容笔推荐·电容笔测评