更新時(shí)間:2016年03月02日17時(shí)20分 來(lái)源:傳智播客 瀏覽次數(shù):
1、網(wǎng)絡(luò)多線程(★★★)
一、多線程的底層實(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?
• OC的NSThread?
• C語(yǔ)言的GCD接口(性能最好,代碼更精簡(jiǎn))?
OC的NSOperation和NSOperationQueue(基于GCD)
二、線程間怎么通信?
http://blog.csdn.net/bawangxx/article/details/50546314
三、網(wǎng)絡(luò)圖片處理問(wèn)題中怎么解決一個(gè)相同的網(wǎng)絡(luò)地址重復(fù)請(qǐng)求的問(wèn)題?
利用字典(圖片地址為key,下載操作為value)
四、用NSOpertion和NSOpertionQueue處理A,B,C三個(gè)線程,要求執(zhí)行完A,B后才能執(zhí)行C,怎么做?
// 創(chuàng)建隊(duì)列
NSOperationQueue *queue = [[NSOperationQueue alloc] init];
// 創(chuàng)建3個(gè)操作
NSOperation *a = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”operationA---“);
}];
NSOperation *b = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”operationB---“);
}];
NSOperation *c = [NSBlockOperation blockOperationWithBlock:^{
NSLog(@”operationC---“);
}];
// 添加依賴(lài)
[c addDependency:a];
[c addDependency:b];
// 執(zhí)行操作
[queue addOperation:a];
[queue addOperation:b];
[queue addOperation:c];
五、列舉cocoa中常見(jiàn)對(duì)幾種多線程的實(shí)現(xiàn),并談?wù)劧嗑€程安全的幾種解決辦法及多線程安全怎么控制?
1> 只在主線程刷新訪問(wèn)UI
2> 如果要防止資源搶奪,得用synchronized進(jìn)行加鎖保護(hù)
3> 如果異步操作要保證線程安全等問(wèn)題, 盡量使用GCD(有些函數(shù)默認(rèn)就是安全的)
六、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(操作) ?
DispatchSource :處理事件
七、你用過(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
八、 既然提到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
九、在異步線程中下載很多圖片,如果失敗了,該如何處理?請(qǐng)結(jié)合RunLoop來(lái)談?wù)劷鉀Q方案.(提示:在異步線程中啟動(dòng)一個(gè)RunLoop重新發(fā)送網(wǎng)絡(luò)請(qǐng)求,下載圖片)
1> 重新下載圖片
2> 下載完畢, 利用RunLoop的輸入源回到主線程刷新UIImageVIUew
十、Socket的實(shí)現(xiàn)原理及Socket之間是如何通信的
http://blog.csdn.net/jiajia4336/article/details/8798421
http://no001.blog.51cto.com/1142339/555344/
十一、 http協(xié)議的實(shí)現(xiàn)
http://www.blogjava.net/crespochen/archive/2008/10/22/235948.html
十二、什么是TCP連接的三次握手
第一次握手:客戶(hù)端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀態(tài),等待服務(wù)器確認(rèn);
第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶(hù)的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài);
第三次握手:客戶(hù)端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢,客戶(hù)端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手。
握手過(guò)程中傳送的包里不包含數(shù)據(jù),三次握手完畢后,客戶(hù)端與服務(wù)器才正式開(kāi)始傳送數(shù)據(jù)。理想狀態(tài)下,TCP連接一旦建立,在通信雙方中的任何一方主動(dòng)關(guān)閉連接之前,TCP 連接都將被一直保持下去。斷開(kāi)連接時(shí)服務(wù)器和客戶(hù)端均可以主動(dòng)發(fā)起斷開(kāi)TCP連接的請(qǐng)求,斷開(kāi)過(guò)程需要經(jīng)過(guò)“四次握手”(過(guò)程就不細(xì)寫(xiě)了,就是服務(wù)器和客戶(hù)端交互,最終確定斷開(kāi))
十三、http協(xié)議的組成和特性
組成:http請(qǐng)求由三部分組成,分別是:請(qǐng)求行、消息報(bào)頭、請(qǐng)求正文特性:HTTP協(xié)議的主要特點(diǎn)可概括如下:1.支持客戶(hù)/服務(wù)器模式。2.簡(jiǎn)單快速:客戶(hù)向服務(wù)器請(qǐng)求服務(wù)時(shí),只需傳送請(qǐng)求方法和路徑。請(qǐng)求方法常用的有GET、HEAD、POST。每種方法規(guī)定了客戶(hù)與服務(wù)器聯(lián)系的類(lèi)型不同。由于HTTP協(xié)議簡(jiǎn)單,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快。3.靈活:HTTP允許傳輸任意類(lèi)型的數(shù)據(jù)對(duì)象。正在傳輸?shù)念?lèi)型由Content-Type加以標(biāo)記。4.無(wú)連接:無(wú)連接的含義是限制每次連接只處理一個(gè)請(qǐng)求。服務(wù)器處理完客戶(hù)的請(qǐng)求,并收到客戶(hù)的應(yīng)答后,即斷開(kāi)連接。采用這種方式可以節(jié)省傳輸時(shí)間。5.無(wú)狀態(tài):HTTP協(xié)議是無(wú)狀態(tài)協(xié)議。無(wú)狀態(tài)是指協(xié)議對(duì)于事務(wù)處理沒(méi)有記憶能力。缺少狀態(tài)意味著如果后續(xù)處理需要前面的信息,則它必須重傳,這樣可能導(dǎo)致每次連接傳送的數(shù)據(jù)量增大。另一方面,在服務(wù)器不需要先前信息時(shí)它的應(yīng)答就較快。
十四、在項(xiàng)目什么時(shí)候選擇使用GCD,什么時(shí)候選擇NSOperation?
項(xiàng)目中使用NSOperation的優(yōu)點(diǎn)是NSOperation是對(duì)線程的高度抽象,在項(xiàng)目中使用它,會(huì)使項(xiàng)目的程序結(jié)構(gòu)更好,子類(lèi)化NSOperation的設(shè)計(jì)思路,是具有面向?qū)ο蟮膬?yōu)點(diǎn)(復(fù)用、封裝),使得實(shí)現(xiàn)是多線程支持,而接口簡(jiǎn)單,建議在復(fù)雜項(xiàng)目中使用。項(xiàng)目中使用GCD的優(yōu)點(diǎn)是GCD本身非常簡(jiǎn)單、易用,對(duì)于不復(fù)雜的多線程操作,會(huì)節(jié)省代碼量,而B(niǎo)lock參數(shù)的使用,會(huì)是代碼更為易讀,建議在簡(jiǎn)單項(xiàng)目中使用。
十五、OC中的協(xié)議和java中的接口概念有何不同?
OBC中的代理有2層含義,官方定義為 formal和informal protocol。前者和Java接口一樣。?informal protocol中的方法屬于設(shè)計(jì)模式考慮范疇,不是必須實(shí)現(xiàn)的,但是如果有實(shí)現(xiàn),就會(huì)改變類(lèi)的屬性。?其實(shí)關(guān)于正式協(xié)議,類(lèi)別和非正式協(xié)議我很早前學(xué)習(xí)的時(shí)候大致看過(guò),也寫(xiě)在了學(xué)習(xí)教程里?“非正式協(xié)議概念其實(shí)就是類(lèi)別的另一種表達(dá)方式“這里有一些你可能希望實(shí)現(xiàn)的方法,你可以使用他們更好的完成工作”。?這個(gè)意思是,這些是可選的。比如我門(mén)要一個(gè)更好的方法,我們就會(huì)申明一個(gè)這樣的類(lèi)別去實(shí)現(xiàn)。然后你在后期可以直接使用這些更好的方法。?這么看,總覺(jué)得類(lèi)別這玩意兒有點(diǎn)像協(xié)議的可選協(xié)議。"?現(xiàn)在來(lái)看,其實(shí)protocal已經(jīng)開(kāi)始對(duì)兩者都統(tǒng)一和規(guī)范起來(lái)操作,因?yàn)橘Y料中說(shuō)“非正式協(xié)議使用interface修飾“,?現(xiàn)在我們看到協(xié)議中兩個(gè)修飾詞:“必須實(shí)現(xiàn)(@requied)”和“可選實(shí)現(xiàn)(@optional)”。
IOS培訓(xùn)實(shí)戰(zhàn)教程之何時(shí)使用Swift Structs和Classes
2015-12-29IOS培訓(xùn)實(shí)戰(zhàn)教程之開(kāi)發(fā)代碼規(guī)范
2015-12-29IOS培訓(xùn)實(shí)戰(zhàn)教程之iOS9新系統(tǒng)下APP Store 應(yīng)用上傳新指南
2015-12-29IOS培訓(xùn)實(shí)戰(zhàn)教程之iOS Xcode部署配置
2015-12-28IOS培訓(xùn)實(shí)戰(zhàn)教程之17個(gè)提升iOS開(kāi)發(fā)效率的必用工具
2015-12-28北京校區(qū)