NSThread
NSThread封裝性最差鲁豪,最偏向于底層,主要基于thread使用律秃,生命周期需要手動管理爬橡,所以這套方案也是偶爾用用,比如 [NSThread currentThread]棒动,它可以獲取當(dāng)前線程類糙申,你就可以知道當(dāng)前線程的各種屬性,用于調(diào)試十分方便船惨。
一柜裸、線程創(chuàng)建
// 創(chuàng)建并自動啟動
[NSThread detachNewThreadSelector:@selector(threadAlloc:) toTarget:self withObject:nil];
// 先創(chuàng)建線程,再啟動
NSThread *newThread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:obj];
[newThread run];
// ios(10.0)粱锐,線程的創(chuàng)建疙挺,線程創(chuàng)建后直接運行
[NSThread detachNewThreadWithBlock:^{
[do something];
}];
[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:obj];
Paste_Image.png
二、線程之間的通訊
// 在主線程中運行方法怜浅,wait表示是否阻塞這個方法的調(diào)用铐然,如果為YES則等待主線程中運行方法結(jié)束,一般可用于在子線程中調(diào)用UI方法海雪。
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array;
// 隱含產(chǎn)生新線程
- (void)performSelectorInBackground:(SEL)aSelector withObject:(nullable id)arg;
// 在指定線程中執(zhí)行锦爵,但該線程必須具備run loop。
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)thr withObject:(nullable id)arg waitUntilDone:(BOOL)wait modes:(nullable NSArray<NSString *> *)array;
三奥裸、NSThread的其它一些常用的方法
+ (NSThread *)currentThread; // 獲得當(dāng)前線程
+ (void)sleepForTimeInterval:(NSTimeInterval)ti; // 線程休眠
+ (NSThread *)mainThread; // 主線程险掀,亦即UI線程了
+ (BOOL)isMainThread; // 判斷當(dāng)前線程是否是主線程
+ (BOOL)isMultiThreaded; // 判斷當(dāng)前線程是否是多線程
+ (void)sleepUntilDate:(NSDate *)date; // 當(dāng)前線程休眠到指定日期
+ (void)exit; // 強行退出當(dāng)前線程
+ (double)threadPriority; // 獲取當(dāng)前線程線程優(yōu)先級
+ (BOOL)setThreadPriority:(double)p; // 給當(dāng)前線程設(shè)定優(yōu)先級,調(diào)度優(yōu)先級的取值范圍是0.0 ~ 1.0湾宙,默認(rèn)0.5樟氢,值越大冈绊,優(yōu)先級越高。
+ (NSArray *)callStackReturnAddresses // 線程的調(diào)用都會有函數(shù)的調(diào)用函數(shù)的調(diào)用就會有棧返回地址的記錄埠啃,在這里返回的是函 數(shù)調(diào)用返回的虛擬地址死宣,說白了就是在該線程中函數(shù)調(diào)用的虛擬地址的數(shù)組
+ (NSArray *)callStackSymbols // 同上面的方法一樣,只不過返回的是該線程調(diào)用函數(shù)的名字?jǐn)?shù)字
+ (BOOL)isMainThread; // 當(dāng)前線程是否主線程
- (BOOL)isMainThread;
- (BOOL)isExecuting; // 線程是否正在運行
- (BOOL)isFinished; // 線程是否已結(jié)束
- (void)cancel // 終止線程循環(huán)
- (void)start // 開啟線程循環(huán)
- (void)isCancelled; //判斷線程是否撤銷
- (void)setName:(NSString *)n; //設(shè)置線程名稱