前言:iPhone 中的線程應用並非無節制的,官方給出的資料顯示iPhone OS下的主線程的堆棧大小是1M,第二個線程開始都是512KB。而且該值不能經過編譯器開關或線程API函數來更改。ios
實現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上提高效率spa
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------線程
這篇文章主要介紹NSThread的使用code
1、建立orm
線程建立主要有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;
2、獲取當前線程和主線程
NSThread *current = [NSThread currentThread];
NSThread *main = [NSThread mainThread];
3、暫停
// 暫停2s [NSThread sleepForTimeInterval:2]; // 或者 NSDate *date = [NSDate dateWithTimeInterval:2 sinceDate:[NSDate date]]; [NSThread sleepUntilDate:date];
4、線程間通訊
//在指定線程上執行操做 [self performSelector:@selector(run) onThread:thread withObject:nil waitUntilDone:YES]; //在主線程上執行操做 [self performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:YES]; //在當前線程執行操做 [self performSelector:@selector(run) withObject:nil];
5、優缺點
1.優勢:NSThread比其餘兩種多線程方案較輕量級,更直觀地控制線程對象
2.缺點:須要本身管理線程的生命週期,線程同步。線程同步對數據的加鎖會有必定的系統開銷