標籤:des style blog io color ar os 使用 for
前言:iPhone 中的線程應用並不是無節制的,官方給出的資料顯示iPhone OS下的主線程的堆棧大小是1M,第二個線程開始都是512KB。並且該值不能通過編譯器開關或線程API函數來更改。
實現ios多線程主要有3種方法:NSThread 、NSOperation 、GCD。
iOS支援多個層次的多線程編程,層次越高的抽象程度越高,使用也越方便,也是蘋果最推薦使用的方法。下面根據抽象層次從低到高依次列出iOS所支援的多線程編程方法:
1.Thread :是三種方法裡面相對輕量級的,但需要管理線程的生命週期、同步、加鎖問題,這會導致一定的效能開銷
2.Cocoa Operations:是基於OC實現的,NSOperation以物件導向的方式封裝了需要執行的操作,不必關心線程管理、同步等問題。NSOperation是一個抽象基類,iOS提供了兩種預設實現:NSInvocationOperation和NSBlockOperation,當然也可以自訂NSOperation
3.Grand Central Dispatch(簡稱GCD,iOS4才開始支援):提供了一些新特性、運行庫來支援多核並行編程,它的關注點更高:如何在多個cpu上提升效率
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
這篇文章主要介紹NSThread的使用
一、建立
線程建立主要有3種方式:
- (id)init; // designated initializer- (id)initWithTarget:(id)target selector:(SEL)selector object:(id)argument; //target參數:selector訊息發送的對象
當然,還有一種比較特殊,就是使用所謂的convenient method,這個方法可以直接產生一個線程並啟動它,而且無需為線程的清理負責。這個方法的介面是:
+ (void)detachNewThreadSelector:(SEL)aSelector toTarget:(id)aTarget withObject:(id)anArgument
還有個隱式建立線程的方法:
[self performSelectorInBackground:@selector(run) withObject:nil];
前兩種方法建立後,需要自己手動啟動,啟動的方法是:
- (void)start;
二、擷取當前線程和主線程
NSThread *current = [NSThread currentThread]; NSThread *main = [NSThread mainThread];
三、暫停
// 暫停2s [NSThread sleepForTimeInterval:2]; // 或者 NSDate *date = [NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]]; [NSThread sleepUntilDate:date];
四、線程間通訊
//在指定線程上執行操作[self performSelector:@selector(run) onThread:thread withObject:nil waitUntilDone:YES]; //在主線程上執行操作[self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:YES]; //在當前線程執行操作[self performSelector:@selector(run) withObject:nil];
五、優缺點
1.優點:NSThread比其他兩種多線程方案較輕量級,更直觀地控制線程對象
2.缺點:需要自己管理線程的生命週期,線程同步。線程同步對資料的加鎖會有一定的系統開銷
iOS多線程系列(一)------NSThread