1. 多線程的底層實現
(1)首先什么是線程
1個進程要想執行任務,必須得有線程.線程是進程的基本執行單元,一個進程(程序)的所有任務都在線程中執行
(2)什么是多線程
1個進程中可以開啟多條線程,每條線程可以并行(同時)執行不同的任務。
多線程的作用:更新顯示UI界面、處理用戶觸摸事件。
(3)Mach是第一個以多線程方式處理任務的系統,因此多線程的底層實現機制是基于Mach的線程。
(4)開發中實現多線程的方案
1》C語言的POSIX接口:#include
2》OC的NSThread
3》 C語言的GCD接口(性能最好,代碼更精簡)
4》OC的NSOperation和NSOperationQueue(基于GCD)
2. 線程間怎么通信?
線程間通信的體現
1個線程傳遞數據給另1個線程
在1個線程中執行完特定任務后,轉到另1個線程繼續執行任務
有三種分別有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可以很方便的調整執行順序,可以添加依賴設置最大并發數量。
3》GCD的執行速度比NSOperationQueue快
4》NSOperationQueue支持KVO,可以檢測Operation是否正在執行,是否結束,是否取消。
如何進行選擇?
任務之間不太相互依賴,選用GCD;
任務之間有依賴,或者要監聽任務的執行情況:NSOperationQueue
4. 網絡圖片處理問題中怎么解決一個相同的網絡地址重復請求的問題?
利用字典圖片地址為key,下載操作為value

5. 用NSOperation和NSOperationQueue處理A,B,C三個線程,要求執行完A,B后才能執行C,怎么做?
?```
abjc
// 創建隊列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 創建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];
// 執行操作
[queue addOperation:a];
[queue addOperation:b];
[queue addOperation:c];
?```
6. 列舉常見多線程的實現,并談談多線程安全的幾種解決方法及多線程安全怎么控制?
1> 只在主線程刷新訪問UI
2> 如果要防止資源搶奪,得用synchronized進行加鎖保護
3> 如果異步操作要保證線程安全等問題, 盡量使用GCD(有些函數默認就是安全的)
7. GCD內部實現
1> iOS和OS X的核心是XNU內核,GCD是基于XNU內核實現的
2> GCD的API全部在libdispatch庫中
3> GCD的底層實現主要有Dispatch Queue和Dispatch Source
l Dispatch Queue :管理block(操作)
l Dispatch Source :處理事件
8. 你用過NSOperationQueue么?如果用過或者了解的話,你為什么要使用NSOperationQueue,實現了什么?請描述它和GCD的區別和類似的地方
1》GCD是純C語言的API,NSOperationQueue是基于GCD的OC版本的封裝
2》GCD只支持FIFO的隊列,NSOperationQueue可以很方便的調整執行順序,可以添加依賴設置最大并發數量。
3》GCD的執行速度比NSOperationQueue快
4》NSOperationQueue支持KVO,可以檢測Operation是否正在執行,是否結束,是否取消。
如何進行選擇?
任務之間不太相互依賴,選用GCD;
任務之間有依賴,或者要監聽任務的執行情況:NSOperationQueue
9既然提到GCD,那么問一下在使用GCD以及block時要注意些什么?它們兩是一回事兒么?block在ARC中和傳統的MRC中的行為和用法有沒有什么區別,需要注意些什么?
Block的使用注意:
1> block的內存管理
2> 防止循環retian
l 非ARC(MRC):__block
l ARC:__weak\__unsafe_unretained
10. 在異步線程中下載很多圖片,如果失敗了,該如何處理?請結合RunLoop來談談解決方案.(提示:在異步線程中啟動一個RunLoop重新發送網絡請求,下載圖片)
1> 重新下載圖片
2> 下載完畢, 利用RunLoop的輸入源回到主線程刷新UIImageView
11. Socket的實現原理及Socket之間是如何通信的
Socket 中的TCP的三次握手建立連接詳解
1.客戶端向服務器發送一個SYN J(消息請求)
2.服務器向客戶端響應一個SYN K,并對SYN J進行確認ACK J+1(消息請求回復)
3.客戶端再向服務器發一個確認ACK K+1(消息請求會回復確認)

socket中的TCP(傳輸控制協議)的四次揮手釋放連接
1.某個應用進程首先調用active close主動關閉連接,這時TCP發送一個FIN M(結束);
2.另一端接收到FIN M之后,執行被動關閉,對這個FIN進行確認。它的接收也作為文件結束符傳遞給應用進程,因為FIN的接收意味著應用進程在相應的連接上再也接收不到額外數據;
3.一段時間之后,接收到文件結束符的應用進程調用close關閉它的socket。這導致它的TCP也發送一個FIN N;
4.接收到這個FIN的源發送端TCP對它進行確認。