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 检查实现线程退出。
相关推荐
代码的小搬运工12 小时前
KVO学习
学习·ios·cocoa
方白羽13 小时前
为什么 Android 非要用 Intent 传值?
android·ios·harmonyos
dora14 小时前
iOS开发新手的第一行代码
ios
用户380341658829721 小时前
视频编辑器的滤镜图内核:Node/Pin 模型怎么设计,撤销重做怎么才不崩
ios
CocoaKier1 天前
苹果续费成功,几天后付费协议突然失效,导致线上苹果支付全部失败
ios·apple
深念Y2 天前
PVE 安装黑苹果并直通 Quadro P400
macos·ios·黑苹果·驱动·苹果·英伟达·p400
weixin-a153003083162 天前
7.Appium-ios端自动化
ios·appium·自动化
Anhty2 天前
2026九月最新变声器测评:iOS安卓双端适配,低延迟运行更稳定
android·人工智能·功能测试·ios·智能手机
_瑞3 天前
APM_OOMDetector
ios
秋雨梧桐叶落莳3 天前
【iOS】从源码深入理解RunLoop机制
macos·ios·objective-c·cocoa·cocoapods·uikit