在 Objective-C 中創建多線程主要有兩種經典 API:NSThread initWithTarget:selector:object:(手動啟動)與 NSThread detachNewThreadSelector:toTarget:withObject:(自動啟動)。本文提供兩種方式的完整可編譯代碼示例,均演示參數傳遞與線程執行流程。
// main.m #import@interface Worker : NSObject - (void)startTask:(NSString *)msg; @end @implementation Worker - (void)startTask:(NSString *)msg { sleep(3); // 模擬耗時操作 NSLog(@"%@", msg); // 打印傳入參數 exit(0); // 直接退出進程(演示用) } @end int main(int argc, const char * argv[]) { @autoreleasepool { NSLog(@"Hello, World!"); } Worker *worker = [[Worker alloc] init]; // 創建線程對象,目標 worker,選子 startTask:,參數 @"Start" NSThread *thread = [[NSThread alloc] initWithTarget:worker selector:@selector(startTask:) object:@"Start"]; [thread start]; // 手動啟動線程 sleep(5); // 主線程等待子線程結束 return 0; }
關鍵點:線程對象創建後需顯式調用 start 才開始執行,適合需精確控制啟動時機、優先級、攜帶自定義屬性的場景。
// main.m #import@interface Worker : NSObject - (void)startTask:(NSString *)msg; @end @implementation Worker - (void)startTask:(NSString *)msg { NSLog(@"%@", msg); exit(0); } @end int main(int argc, const char * argv[]) { @autoreleasepool { NSLog(@"Hello, World!"); Worker *worker = [[Worker alloc] init]; // 一行代碼完成創建、啟動、參數傳遞 [NSThread detachNewThreadSelector:@selector(startTask:) toTarget:worker withObject:@"Start"]; sleep(5); } return 0; }
關鍵點:類方法直接創建並啟動線程,無需持有線程對象,代碼極簡,適合「發射後不管」的簡單異步任務。
| 維度 | initWithTarget | detachNewThreadSelector |
|---|---|---|
| 線程對象 | 持有 NSThread * | 不返回,無法直接引用 |
| 啟動控制 | 手動 [thread start] | 隱式立即啟動 |
| 配置選項 | 可設優先級、堆疊大小、名稱 | 無法配置,使用默認值 |
| 適用場景 | 需精細控制、長期運行、需取消/暫停 | 一次性簡單任務、火燭忘風格 |