NSThread通常來說, 有以下3種創(chuàng)建子線程的方式:
1.通過[[NSThread alloc] init]可以實例化一個線程對象(也就是直接可以通過此方式創(chuàng)建并獲取一個子線程對象):
通過初始化創(chuàng)建子線程對象,將要在子線程中執(zhí)行的任務(wù)放在block中傳入:
NSThread *thread = [[NSThread alloc] initWithBlock:^{
for (int i = 0 ; i < 10000; i++) {
NSLog(@"%d---%@",i,[NSThread currentThread]);
}
}];
[thread start]; //調(diào)用start方法才能執(zhí)行線程的任務(wù)
//通過傳入sel方法及和對象初始化子線程對象,子線程中執(zhí)行當(dāng)前類的run:方法傳入字符串@"jack".:
NSThread *thread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:@"jack"];
[thread start];
thread.name = @"jack_thread";
2.通過NSThread的detachNewThread類方法在子線程中執(zhí)行任務(wù),但是無法獲取或者操作此線程, 如果僅僅是要開辟子線程執(zhí)行相關(guān)任務(wù),并無需設(shè)置子線程相關(guān)屬性或者名稱可以使用此方法:
[NSThread detachNewThreadWithBlock:^{
NSLog(@"%@",[NSThread currentThread]);
}];
[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:@"jack"]; //子線程中執(zhí)行當(dāng)前類的run:方法傳入字符串@"jack".
3.系統(tǒng)有一個基于NSObject的分類: NSThreadPerformAdditions, 在此分類中有個對NSObject類的擴展實例方法:
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg API_AVAILABLE(macos(10.5), ios(2.0), watchos(2.0), tvos(9.0));
我們可以在需要創(chuàng)建子線程的地方, 例如控制器調(diào)用:
//在子線程中執(zhí)行當(dāng)前類的run:方法傳入?yún)?shù)@"jack"
[self performSelectorInBackground:@selector(run:) withObject:@"jack"];