1.多線程的底層實(shí)現(xiàn)做祝?
1>首先搞清楚什么是線程状婶、什么是多線程
2> Mach是第一個(gè)以多線程方式處理任務(wù)的系統(tǒng)蛇更,因此多線程的底層實(shí)現(xiàn)機(jī)制是基于Mach的線程
3>開(kāi)發(fā)中很少用Mach級(jí)的線程李茫,因?yàn)镸ach級(jí)的線程沒(méi)有提供多線程的基本特征,線程之間是獨(dú)立的
4>開(kāi)發(fā)中實(shí)現(xiàn)多線程的方案
C語(yǔ)言的POSIX接口:#include <pthread.h>
OC的NSThread
? C語(yǔ)言的GCD接口(性能最好谆棺,代碼更精簡(jiǎn))
? OC的NSOperation和NSOperationQueue(基于GCD)
2.線程間怎么通信?
1> performSelector:onThread:withObject:waitUntilDone:
2> NSMachPort
3.網(wǎng)絡(luò)圖片處理問(wèn)題中怎么解決一個(gè)相同的網(wǎng)絡(luò)地址重復(fù)請(qǐng)求的問(wèn)題罕袋?
利用字典(圖片地址為key改淑,下載操作為value)可以參考SDWebImage。
4.用NSOpertion和NSOpertionQueue處理A,B,C三個(gè)線程,要求執(zhí)行完A,B后才能執(zhí)行C,怎么做炫贤?
'''//創(chuàng)建隊(duì)列
NSOperationQueue*queue = [[NSOperationQueuealloc]init];
//創(chuàng)建3個(gè)操作
NSOperation*a = [NSBlockOperationblockOperationWithBlock:^{
NSLog(@"operation1---");
}];
NSOperation*b = [NSBlockOperationblockOperationWithBlock:^{
NSLog(@"operation1---");
}];
NSOperation*c = [NSBlockOperationblockOperationWithBlock:^{
NSLog(@"operation1---");
}];
//添加依賴(lài)
[caddDependency:a];
[caddDependency:b];
//執(zhí)行操作
[queueaddOperation:a];
[queueaddOperation:b];
[queueaddOperation:c];'''
5.列舉cocoa中常見(jiàn)對(duì)幾種多線程的實(shí)現(xiàn)溅固,并談?wù)劧嗑€程安全的幾種解決辦法及多線程安全怎么控制?
1>只在主線程刷新訪問(wèn)UI
2>如果要防止資源搶奪兰珍,得用synchronized進(jìn)行加鎖保護(hù)
3>如果異步操作要保證線程安全等問(wèn)題,盡量使用GCD(有些函數(shù)默認(rèn)就是安全的)
6.GCD內(nèi)部怎么實(shí)現(xiàn)的
1> iOS和OS X的核心是XNU內(nèi)核侍郭,GCD是基于XNU內(nèi)核實(shí)現(xiàn)的
2> GCD的API全部在libdispatch庫(kù)中
3> GCD的底層實(shí)現(xiàn)主要有Dispatch Queue和Dispatch Source
? Dispatch Queue:管理block(操作)
? Dispatch Source:處理事件
7.你用過(guò)NSOperationQueue么?如果用過(guò)或者了解的話,你為什么要使用NSOperationQueue亮元,實(shí)現(xiàn)了什么猛计?請(qǐng)描述它和GCD的區(qū)別和類(lèi)似的地方(提示:可以從兩者的實(shí)現(xiàn)機(jī)制和適用范圍來(lái)描述)。
1> GCD是純C語(yǔ)言的API爆捞,NSOperationQueue是基于GCD的OC版本封裝
2> GCD只支持FIFO的隊(duì)列奉瘤,NSOperationQueue可以很方便地調(diào)整執(zhí)行順序、設(shè)置最大并發(fā)數(shù)量
3> NSOperationQueue可以在輕松在Operation間設(shè)置依賴(lài)關(guān)系煮甥,而GCD需要寫(xiě)很多的代碼才能實(shí)現(xiàn)
4> NSOperationQueue支持KVO盗温,可以監(jiān)測(cè)operation是否正在執(zhí)行(isExecuted)、是否結(jié)束(isFinished)成肘,是否取消(isCanceld)
5> GCD的執(zhí)行速度比NSOperationQueue快
任務(wù)之間不太互相依賴(lài):GCD
任務(wù)之間有依賴(lài)\或者要監(jiān)聽(tīng)任務(wù)的執(zhí)行情況:NSOperationQueue
8.既然提到GCD卖局,那么問(wèn)一下在使用GCD以及block時(shí)要注意些什么?它們兩是一回事兒么双霍?block在ARC中和傳統(tǒng)的MRC中的行為和用法有沒(méi)有什么區(qū)別砚偶,需要注意些什么?
Block的使用注意:
1>block的內(nèi)存管理
2>防止循環(huán)retian
? 非ARC(MRC):__block
? ARC:__weak\__unsafe_unretained
9.在異步線程中下載很多圖片,如果失敗了,該如何處理?請(qǐng)結(jié)合RunLoop來(lái)談?wù)劷鉀Q方案.(提示:在異步線程中啟動(dòng)一個(gè)RunLoop重新發(fā)送網(wǎng)絡(luò)請(qǐng)求,下載圖片)
1>重新下載圖片
2>下載完畢,利用RunLoop的輸入源回到主線程刷新UIImageVIUew