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 检查实现线程退出。
相关推荐
游戏开发爱好者823 分钟前
Nginx HTTPS 深入实战 配置、性能与排查全流程(Nginx https
运维·nginx·ios·小程序·https·uni-app·iphone
游戏开发爱好者82 小时前
TCP 抓包分析:tcp抓包工具、 iOS/HTTPS 流量解析全流程
网络协议·tcp/ip·ios·小程序·https·uni-app·iphone
天堂罗恋歌3 小时前
CocoaPods 安装 Masonry 库时出现的网络连接问题处理
ios·iphone·xcode·cocoapods·app store
2501_916008893 小时前
iOS 26 软件性能测试全流程,启动渲染资源压力对比与优化策略
android·macos·ios·小程序·uni-app·cocoa·iphone
00后程序员张4 小时前
iOS 26 兼容测试实战,机型兼容、SwiftUI 兼容性改动
android·ios·小程序·uni-app·swiftui·cocoa·iphone
2501_915106325 小时前
iOS 可分发是已经上架了吗?深入解析应用分发状态、ipa 文件上传、TestFlight 测试与 App Store 审核流程
android·ios·小程序·https·uni-app·iphone·webview
2501_9160074713 小时前
HTTPS 抓包乱码怎么办?原因剖析、排查步骤与实战工具对策(HTTPS 抓包乱码、gzipbrotli、TLS 解密、iOS 抓包)
android·ios·小程序·https·uni-app·iphone·webview
2501_9160088919 小时前
HTTPS 双向认证抓包实战,原理、难点、工具与可操作的排查流程
网络协议·http·ios·小程序·https·uni-app·iphone
2501_9151063219 小时前
HTTPS 能抓包吗?实战答案与逐步可行方案(HTTPS 抓包原理、证书Pinning双向认证应对、工具对比)
网络协议·http·ios·小程序·https·uni-app·iphone
游戏开发爱好者819 小时前
App HTTPS 抓包实战,原理、常见问题与可行工具路线(开发 测试 安全 角度)
网络协议·安全·ios·小程序·https·uni-app·iphone