1. 多線程的底層實現(xiàn)
(1)首先什么是線程
1個進程要想執(zhí)行任務棺蛛,必須得有線程.線程是進程的基本執(zhí)行單元宵统,一個進程(程序)的所有任務都在線程中執(zhí)行
(2)什么是多線程
1個進程中可以開啟多條線程浇垦,每條線程可以并行(同時)執(zhí)行不同的任務速妖。
多線程的作用:更新顯示UI界面剖煌、處理用戶觸摸事件赋访。
(3)Mach是第一個以多線程方式處理任務的系統(tǒng)舟陆,因此多線程的底層實現(xiàn)機制是基于Mach的線程桥胞。
(4)開發(fā)中實現(xiàn)多線程的方案
1》C語言的POSIX接口:#include
2》OC的NSThread
3》 C語言的GCD接口(性能最好背稼,代碼更精簡)
4》OC的NSOperation和NSOperationQueue(基于GCD)
2. 線程間怎么通信?
線程間通信的體現(xiàn)
1個線程傳遞數(shù)據(jù)給另1個線程
在1個線程中執(zhí)行完特定任務后综芥,轉到另1個線程繼續(xù)執(zhí)行任務
有三種分別有GCD,NSThread的線程通信
?```
- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
- (void)performSelector:(SEL)aSelector onThread:(NSThread *)the withObject:(id)arg waitUntilDone:(BOOL)wait;
?```
3. GCD和NSOperationQueue與第8個問題其實一樣
1》GCD是純C語言的API搂擦,NSOperationQueue是基于GCD的OC版本的封裝
2》GCD只支持FIFO的隊列,NSOperationQueue可以很方便的調整執(zhí)行順序歌逢,可以添加依賴設置最大并發(fā)數(shù)量签杈。
3》GCD的執(zhí)行速度比NSOperationQueue快
4》NSOperationQueue支持KVO,可以檢測Operation是否正在執(zhí)行沽一,是否結束盖溺,是否取消。
如何進行選擇铣缠?
任務之間不太相互依賴烘嘱,選用GCD;
任務之間有依賴蝗蛙,或者要監(jiān)聽任務的執(zhí)行情況:NSOperationQueue
4. 網絡圖片處理問題中怎么解決一個相同的網絡地址重復請求的問題蝇庭?
利用字典圖片地址為key,下載操作為value
![](media/14637971488015.jpg)
5. 用NSOperation和NSOperationQueue處理A,B,C三個線程,要求執(zhí)行完A,B后才能執(zhí)行C,怎么做捡硅?
?```
abjc
// 創(chuàng)建隊列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 創(chuàng)建3個操作
NSOperation *a = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”operation1---“);
}];
NSOperation *b = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”operation1---“);
}];
NSOperation *c = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”operation1---“);
}];
// 添加依賴
[c addDependency:a];
[c addDependency:b];
// 執(zhí)行操作
[queue addOperation:a];
[queue addOperation:b];
[queue addOperation:c];
?```
6. 列舉常見多線程的實現(xiàn),并談談多線程安全的幾種解決方法及多線程安全怎么控制?
1> 只在主線程刷新訪問UI
2> 如果要防止資源搶奪哮内,得用synchronized進行加鎖保護
3> 如果異步操作要保證線程安全等問題, 盡量使用GCD(有些函數(shù)默認就是安全的)
7. GCD內部實現(xiàn)
1> iOS和OS X的核心是XNU內核,GCD是基于XNU內核實現(xiàn)的
2> GCD的API全部在libdispatch庫中
3> GCD的底層實現(xiàn)主要有Dispatch Queue和Dispatch Source
l Dispatch Queue :管理block(操作)
l Dispatch Source :處理事件
8. 你用過NSOperationQueue么病曾?如果用過或者了解的話牍蜂,你為什么要使用NSOperationQueue,實現(xiàn)了什么泰涂?請描述它和GCD的區(qū)別和類似的地方
1》GCD是純C語言的API鲫竞,NSOperationQueue是基于GCD的OC版本的封裝
2》GCD只支持FIFO的隊列,NSOperationQueue可以很方便的調整執(zhí)行順序逼蒙,可以添加依賴設置最大并發(fā)數(shù)量从绘。
3》GCD的執(zhí)行速度比NSOperationQueue快
4》NSOperationQueue支持KVO,可以檢測Operation是否正在執(zhí)行是牢,是否結束僵井,是否取消。
如何進行選擇驳棱?
任務之間不太相互依賴批什,選用GCD;
任務之間有依賴社搅,或者要監(jiān)聽任務的執(zhí)行情況:NSOperationQueue
9既然提到GCD驻债,那么問一下在使用GCD以及block時要注意些什么?它們兩是一回事兒么形葬?block在ARC中和傳統(tǒng)的MRC中的行為和用法有沒有什么區(qū)別合呐,需要注意些什么?
Block的使用注意:
1> block的內存管理
2> 防止循環(huán)retian
l 非ARC(MRC):__block
l ARC:__weak\__unsafe_unretained
10. 在異步線程中下載很多圖片,如果失敗了,該如何處理?請結合RunLoop來談談解決方案.(提示:在異步線程中啟動一個RunLoop重新發(fā)送網絡請求,下載圖片)
1> 重新下載圖片
2> 下載完畢, 利用RunLoop的輸入源回到主線程刷新UIImageView
11. Socket的實現(xiàn)原理及Socket之間是如何通信的
Socket 中的TCP的三次握手建立連接詳解
1.客戶端向服務器發(fā)送一個SYN J(消息請求)
2.服務器向客戶端響應一個SYN K笙以,并對SYN J進行確認ACK J+1(消息請求回復)
3.客戶端再向服務器發(fā)一個確認ACK K+1(消息請求會回復確認)
![](media/14637988512800.jpg)
socket中的TCP(傳輸控制協(xié)議)的四次揮手釋放連接
1.某個應用進程首先調用active close主動關閉連接淌实,這時TCP發(fā)送一個FIN M(結束);
2.另一端接收到FIN M之后,執(zhí)行被動關閉拆祈,對這個FIN進行確認恨闪。它的接收也作為文件結束符傳遞給應用進程,因為FIN的接收意味著應用進程在相應的連接上再也接收不到額外數(shù)據(jù)缘屹;
3.一段時間之后凛剥,接收到文件結束符的應用進程調用close關閉它的socket。這導致它的TCP也發(fā)送一個FIN N轻姿;
4.接收到這個FIN的源發(fā)送端TCP對它進行確認。