首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Objective-C 多線程創建兩大方式:initWithTarget 與 detachNewThreadSelector 完整示例

     編輯:關於C語言

Objective-C 多線程創建兩大方式:initWithTarget 與 detachNewThreadSelector 完整示例

在 Objective-C 中創建多線程主要有兩種經典 API:NSThread initWithTarget:selector:object:(手動啟動)與 NSThread detachNewThreadSelector:toTarget:withObject:(自動啟動)。本文提供兩種方式的完整可編譯代碼示例,均演示參數傳遞與線程執行流程。

一、方式一:initWithTarget — 手動控制線程生命週期

// 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 才開始執行,適合需精確控制啟動時機、優先級、攜帶自定義屬性的場景。

二、方式二:detachNewThreadSelector — 隱式創建並立即啟動

// 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;
}

關鍵點:類方法直接創建並啟動線程,無需持有線程對象,代碼極簡,適合「發射後不管」的簡單異步任務。

三、兩種方式對比

四、現代替代方案提示

iOS 4+ / macOS 10.6+ 推薦使用 Grand Central Dispatch (GCD) 或 NSOperationQueue,提供更高級抽象、自動線程池管理、依賴圖、優先級反轉保護等能力:

// GCD 示例
dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0), ^{
    NSLog(@"Background task");
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"Back to main thread");
    });
});

五、總結

掌握 initWithTarget 與 detachNewThreadSelector 兩種經典 API,能讀懂歷史代碼庫中的線程創建邏輯。新專案請優先選用 GCD/NSOperationQueue,享受現代併發框架的安全與高效。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
維度initWithTargetdetachNewThreadSelector
線程對象持有 NSThread *不返回,無法直接引用
啟動控制手動 [thread start]隱式立即啟動
配置選項可設優先級、堆疊大小、名稱無法配置,使用默認值
適用場景需精細控制、長期運行、需取消/暫停一次性簡單任務、火燭忘風格