一. 創(chuàng)建線程的3種方法
1.alloc init
- (void)threadDemo1
{
// 這一句只是 分配內(nèi)存和初始化
??NSThread?*thread = [[NSThread?alloc]?initWithTarget:self?selector:@selector(demo1:)object:@"Thread"];
??// 這一句才是啟動線程
??[thread?start];
}
2.detachNewThreadSelector
- (void)threadDemo2
{
??[NSThread?detachNewThreadSelector:@selector(demo1:)?toTarget:self?withObject:@"detach"];
}
3.performSelectorInBackground
- (void)threadDemo3
{
??[self?performSelectorInBackground:@selector(demo1:)?withObject:@"background"];
}
performSelectorInBackground 是NSObject的一個分類方法洛搀,意味著所有的NSObject都可以使用該方法,在其他線程執(zhí)行方法贫悄!
特點:沒有thread 字眼嘴高,一旦指定竿音,就會立即在后臺線程執(zhí)行selector 方法,是隱式的多線程方法拴驮,這種方法在使用時更加靈活谍失!
例如:
一個 Person 類繼承自NSObject,有個方法 loadData很耗時莹汤,在viewController里實例化一個Person * P,可以這樣調(diào)用:
[PperformSelectorInBackground:@selector(loadData)withObject:nil];
二快鱼、NSLog是專門用來調(diào)試的,性能非常不好,在商業(yè)軟件中抹竹,要盡量去掉
三线罕、
[NSThread currentThread],當前線程對象,可以在所有的多線程技術(shù)中使用窃判,通常用來判斷是否在主線程
輸出的信息中钞楼,關(guān)注 number
Number == 1 說明是主線程
Number != 1 說明不是主線程
四、線程狀態(tài)
//?線程狀態(tài)的demo
- (void)threadStatusDemo
{
??//?實例化線程對象(新建)
??NSThread?*t = [[NSThread?alloc]?initWithTarget:self?selector:@selector(threadStatus)object:nil];
??//?就緒
??[t?start];
}
- (void)threadStatus
{
??NSLog(@"睡會兒");
??//?阻塞
??// sleep?是類方法袄琳,會直接休眠當前線程
??[NSThread?sleepForTimeInterval:2.0];
??for?(int?i =?0; i <?10; i++)
??{
????if?(i ==?4)
????{
??????NSLog(@"再睡會兒");
??????//?線程執(zhí)行中询件,滿足某個條件時,再次休眠
??????[NSThread?sleepUntilDate:[NSDate?dateWithTimeIntervalSinceNow:2.0]];
????}
????NSLog(@"%@, %d", [NSThread?currentThread], i);
????if?(i ==?8)
????{
??????//?終止
??????//?一旦終止唆樊,后續(xù)所有的代碼都不會被執(zhí)行宛琅,注意:在終止線程之前,應該注意釋放之前分配的對象逗旁,如果是ARC?開發(fā)嘿辟,需要注意,清理C語言框架創(chuàng)建的對象片效,否則會出現(xiàn)內(nèi)存泄漏
??????[NSThread?exit];
????}
??}
??NSLog(@"能來嗎红伦?");
}
五、線程屬性
name 淀衣、isMainThread
//?線程屬性
- (void)threadPropertyDemo
{
??NSThread?*t = [[NSThread?alloc]?initWithTarget:self?selector:@selector(threadProperty)object:nil];
??//?屬性1. name:在大的商業(yè)項目中昙读,通常希望程序崩潰的時候,能夠獲取到程序準確執(zhí)行所在的線程
??t.name?=?@"Thread A";
??[t?start];
}
- (void)threadProperty
{
??for?(int?i =?0; i <?2; i++)
??{
????NSLog(@"%@, %d", [NSThread?currentThread], i);
??}
??//?屬性2.?判斷是否是主線程
??if?(![NSThread?isMainThread])
??{
?????//?模擬崩潰
????NSMutableArray?*array = [NSMutableArray?array];
????[array?addObject:nil];
??}
}