NSThread
NSThread封裝性最差,最偏向于底層,主要基于thread使用,生命周期需要手動(dòng)管理,所以這套方案也是偶爾用用,比如 [NSThread currentThread],它可以獲取當(dāng)前線程類,你就可以知道當(dāng)前線程的各種屬性,用于調(diào)試十分方便。
一、線程創(chuàng)建
// 創(chuàng)建并自動(dòng)啟動(dòng)
[NSThread detachNewThreadSelector:@selector(threadAlloc:) toTarget:self withObject:nil];
// 先創(chuàng)建線程,再啟動(dòng)
NSThread *newThread = [[NSThread alloc] initWithTarget:self selector:@selector(run:) object:obj];
[newThread run];
// ios(10.0),線程的創(chuàng)建,線程創(chuàng)建后直接運(yùn)行
[NSThread detachNewThreadWithBlock:^{
[do something];
}];
[NSThread detachNewThreadSelector:@selector(run:) toTarget:self withObject:obj];
Paste_Image.png
二、線程之間的通訊
// 在主線程中運(yùn)行方法,wait表示是否阻塞這個(gè)方法的調(diào)用,如果為YES則等待主線程中運(yùn)行方法結(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; // 強(qiáng)行退出當(dāng)前線程
+ (double)threadPriority; // 獲取當(dāng)前線程線程優(yōu)先級(jí)
+ (BOOL)setThreadPriority:(double)p; // 給當(dāng)前線程設(shè)定優(yōu)先級(jí),調(diào)度優(yōu)先級(jí)的取值范圍是0.0 ~ 1.0,默認(rèn)0.5,值越大,優(yōu)先級(jí)越高。
+ (NSArray *)callStackReturnAddresses // 線程的調(diào)用都會(huì)有函數(shù)的調(diào)用函數(shù)的調(diào)用就會(huì)有棧返回地址的記錄,在這里返回的是函 數(shù)調(diào)用返回的虛擬地址,說(shuō)白了就是在該線程中函數(shù)調(diào)用的虛擬地址的數(shù)組
+ (NSArray *)callStackSymbols // 同上面的方法一樣,只不過(guò)返回的是該線程調(diào)用函數(shù)的名字?jǐn)?shù)字
+ (BOOL)isMainThread; // 當(dāng)前線程是否主線程
- (BOOL)isMainThread;
- (BOOL)isExecuting; // 線程是否正在運(yùn)行
- (BOOL)isFinished; // 線程是否已結(jié)束
- (void)cancel // 終止線程循環(huán)
- (void)start // 開(kāi)啟線程循環(huán)
- (void)isCancelled; //判斷線程是否撤銷
- (void)setName:(NSString *)n; //設(shè)置線程名稱