一、選擇題
對(duì)以下四種多線程的技術(shù)簡介錯(cuò)誤的是( C )
A. pthread是一套通用的多線程API,適用于Unix\Linux\Windows等系統(tǒng),跨平臺(tái)\可移植,使用難度大
B. NSThread 是使用更加面向?qū)ο?簡單易用,可直接操作線程對(duì)象
C. GCD是基于NSThread的,充分利用設(shè)備的多核
D. NSOperation基于GCD(底層是GCD)比GCD多了一些更簡單實(shí)用的功能,使用更加面向?qū)ο?/p>下面關(guān)于GCD說法不正確的是 ( C )
A. GCD是 C語言的“并發(fā)技術(shù)”框架
B. GCD是蘋果公司為多核的并行運(yùn)算提出的解決方案
C. GCD是直接對(duì)線程操作的并發(fā)編程.
D. GCD自動(dòng)管理線程的生命周期(創(chuàng)建線程、調(diào)度任務(wù)条辟、銷毀線程等)
解析:
- GCD是蘋果公司為多核的并行運(yùn)算提出的解決方案
- GCD會(huì)自動(dòng)利用更多的CPU內(nèi)核(比如雙核违寿、四核)
- GCD對(duì)自動(dòng)管理線程的生命周期(創(chuàng)建線程萧豆、調(diào)度任務(wù)籍救、銷毀線程)
- 程序員只需要告訴GCD想要執(zhí)行什么任務(wù)胸蛛、不需要編寫線程任何管理代碼
圖片2.png
- GCD的隊(duì)列可以分為( B )大類型 和( C )種隊(duì)列
A. 1 B. 2 C. 3 D. 4
解析:
圖片3-1.png
三種隊(duì)列:
圖片3-2.png
多選題,以下對(duì)Block的描述正確的是(ABC )
A. Block是一種數(shù)據(jù)類型,可以被當(dāng)做參數(shù)傳遞
B. Block是一個(gè)能工作的代碼單元,可以在任何需要的時(shí)候被執(zhí)行
C. 默認(rèn)情況下,不允許在塊代碼內(nèi)部修改外部變量的數(shù)值
D. 用Block傳值時(shí)要注意循環(huán)引用,當(dāng)Block內(nèi)引用局部變量時(shí)要用__weak修飾此變量來解除循環(huán)引用對(duì)于語句NSString *str = [NSData alloc] init];在編譯時(shí)和運(yùn)行時(shí)分別是什么類型( D )
A. 編譯時(shí)NSData,運(yùn)行時(shí)NSData
B. 編譯時(shí)NSString,運(yùn)行時(shí)NSString
C. 編譯時(shí)NSData,運(yùn)行時(shí)NSString
D. 編譯時(shí)NSString,運(yùn)行時(shí)NSData數(shù)組中可以添加以下那種空值( B )
A. Nil 是類的空指針類型
B. NSNull 集合中的空值
C. nil 是對(duì)象的空指針類型
D. NULL 是其它類型(基本數(shù)據(jù)類型,C類型指針) 為空值
解析:
圖片6.png
以下哪項(xiàng)不是創(chuàng)建線程的目的( D )
A.開啟一條新的執(zhí)行路徑
B.運(yùn)行指定的代碼
C.把耗時(shí)操作放在后臺(tái)執(zhí)行
D.線程開的越多執(zhí)行效率越快關(guān)于NSURLSession說法錯(cuò)誤的是( D )
A.NSURLSession是iOS7中新的網(wǎng)絡(luò)接口,與NSURLConnection是并列的
B.當(dāng)程序在前臺(tái)時(shí),NSURLSession與NSURLConnection大部分可以互相替代
C.NSURLSession支持后臺(tái)網(wǎng)絡(luò)操作污茵,除非用戶強(qiáng)行關(guān)閉
D.所有的NSURLSession對(duì)象必須共用一個(gè)NSURLSessionConfiguration
解析:
每一個(gè)NSURLSession對(duì)象都可以設(shè)置不同的NSURLSessionConfiguration,從而滿足應(yīng)用內(nèi)不同類型的網(wǎng)絡(luò)請(qǐng)求
- 以下哪項(xiàng)不屬于耗時(shí)操作( D )
A. 從服務(wù)器請(qǐng)求用戶信息
B. 文件上傳/下載
C. 執(zhí)行1萬次NSLog(@“itcast");
D. 在本地判斷用戶名是否包含非法字符
解析:
- D選項(xiàng).一般使用正則表達(dá)式判斷用戶名是否包含非法字符,不屬于耗時(shí)操作.
- A.B.兩項(xiàng)都與網(wǎng)絡(luò)有關(guān),都屬于耗時(shí)操作
- C選項(xiàng).NSLog性能比較低,打印1萬次也是耗時(shí)操作,因此實(shí)際開發(fā)中在應(yīng)用程序發(fā)布前都會(huì)將NSLog調(diào)試去掉.
- POST對(duì)上傳的文件大小限制一般為( C )
A. 512KB B. 1M C. 2M D.無限
解析:
圖片10.png
11.下面不屬于block的定義的是( D )
A.返回類型 (^blockName)(參數(shù)列表) = ^返回類型 (參數(shù)列表) { /// 代碼實(shí)現(xiàn); }
B.void (^blockName)(參數(shù)列表) = ^ (參數(shù)列表) { /// 代碼實(shí)現(xiàn); }
C.void (^blockName) = ^ { /// 代碼實(shí)現(xiàn); }
D.void (^blockName)() = ^ { /// 代碼實(shí)現(xiàn); }
12.下面哪一個(gè)不是創(chuàng)建線程的方法( A )
A. [NSThread currentThread];
B.[selfperformSelectorInBackground:@selector(longOperation) withObject:nil];
C.[NSThread detachNewThreadSelector:@selector(longOperation) toTarget:selfwithObject:nil];
D.[[NSThread alloc] initWithTarget:selfselector:@selector(longOperation) object:nil]
13.對(duì)于單例理解正確的是( C )
A.單例是系統(tǒng)自帶的類才有的。
B.單例系統(tǒng)運(yùn)行時(shí)就創(chuàng)建了葬项,不用自己創(chuàng)建泞当。
C.單例是無論以何種方式來創(chuàng)建該類的對(duì)象,創(chuàng)建的對(duì)象總是同一個(gè)民珍。
D.單例是系統(tǒng)給我們提供好的的一種高效率的創(chuàng)建對(duì)象的方法襟士。
二、簡答題
- KVO的實(shí)現(xiàn)原理,使用場(chǎng)景
- KVO的實(shí)現(xiàn)原理:
當(dāng)某個(gè)類的對(duì)象第一次被觀察時(shí)嚷量,系統(tǒng)就會(huì)在運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建該類的一個(gè)派生類陋桂,在這個(gè)派生類中重寫原類中被觀察屬性的setter方法,派生類在被重寫的setter方法實(shí)現(xiàn)真正的通知機(jī)制(Person->NSKVONotifying_Person).
派生類重寫了 class 方法以“欺騙”外部調(diào)用者它就是起初的那個(gè)類。然后系統(tǒng)將這個(gè)對(duì)象的isa指針指向這個(gè)新誕生的派生類蝶溶,因此這個(gè)對(duì)象就成為該派生類的對(duì)象了嗜历,因而在該對(duì)象上對(duì)setter的調(diào)用就會(huì)調(diào)用重寫的setter,從而激活鍵值通知機(jī)制抖所。此外梨州,派生類還重寫了dealloc方法來釋放資源。 - KVO使用場(chǎng)景:
1.實(shí)現(xiàn)上下拉刷新控件 contentoffset
2.webview混合排版 contentsize
3.監(jiān)聽模型屬性實(shí)時(shí)更新UI
手寫單例的實(shí)現(xiàn)
為什么弱引用一些類方法返回的對(duì)象沒有釋放(如 + (id)buttonWithType:(UIButtonType)buttonType;)? ARC中需要使用autorelease嗎,為什么?自動(dòng)釋放池是如何工作的
很多類方法為了在代碼塊結(jié)束時(shí)引用的對(duì)象不會(huì)因無強(qiáng)引用而被釋放內(nèi)存采用自動(dòng)釋放的方式,當(dāng)其最近的自動(dòng)釋放池釋放時(shí)該對(duì)象才會(huì)釋放.
ARC中手動(dòng)添加autoreleasepool可用于提前釋放使用自動(dòng)釋放策略的對(duì)象,防止大量自動(dòng)釋放的對(duì)象堆積造成內(nèi)存峰值過高.
自動(dòng)釋放池時(shí)棧結(jié)構(gòu),每個(gè)線程的runloop運(yùn)行時(shí)都會(huì)自動(dòng)創(chuàng)建自動(dòng)釋放池,程序員可以代碼手動(dòng)創(chuàng)建自動(dòng)釋放池,自動(dòng)釋放的對(duì)象會(huì)被添加到最近的(棧頂)自動(dòng)釋放池中,系統(tǒng)自動(dòng)創(chuàng)建的自動(dòng)釋放池在每個(gè)運(yùn)行循環(huán)結(jié)束時(shí)銷毀釋放池并給池中所有對(duì)象發(fā)release消息,手動(dòng)創(chuàng)建釋放池在所在代碼塊結(jié)束時(shí)銷毀釋放池并發(fā)消息統(tǒng)一releaseNSOperationQueue和GCD的區(qū)別和類似的地方
1> GCD是純C語言的API田轧,NSOperationQueue是基于GCD的OC版本封裝
2> GCD僅僅支持FIFO隊(duì)列摊唇,只可以設(shè)置隊(duì)列的優(yōu)先級(jí),而NSOperationQueue中的每一個(gè)任務(wù)都可以被重新設(shè)置優(yōu)先級(jí)(setQueuePriority:),從而實(shí)現(xiàn)不同操作的執(zhí)行順序調(diào)整,
3> GCD不支持異步操作之間的依賴關(guān)系設(shè)置涯鲁。如果某個(gè)操作的依賴另一個(gè)操作的數(shù)據(jù)巷查,使用NSOperationQueue能夠設(shè)置依賴按照正確的順序執(zhí)行操作(addDependency:)。GCD則沒有內(nèi)建的依賴關(guān)系支持(只能通過Barrior和同步任務(wù)手動(dòng)實(shí)現(xiàn))抹腿。
4> NSOperationQueue方便停止隊(duì)列中的任務(wù)(cancelAllOperations, suspended),GCD不方便停止隊(duì)列中的任務(wù).
5> NSOperationQueue支持KVO岛请,可以監(jiān)測(cè)operation是否正在執(zhí)行(isExecuted)、是否結(jié)束(isFinished)警绩,是否取消(isCanceld)
6> GCD的執(zhí)行速度比NSOperationQueue快
7>NSOperationQueue可設(shè)置最大并發(fā)數(shù)量(節(jié)電),GCD具有dispatch_once(只執(zhí)行一次,單例)和dispatch_after(延遲執(zhí)行)功能出現(xiàn)資源搶奪有哪些解決辦法?
1> 互斥鎖 @synchronized(xx) {...}
2> NSCondition NSLock
3> dispatch_barrior_async
4> dispatch_semaphore_wait請(qǐng)寫出HTTP請(qǐng)求常用的幾種方式崇败。
GET :獲取指定資源
POST :2M 向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求,在RESTful 風(fēng)格用于新增資源
HEAD :獲取指定資源頭部信息
PUT :替換指定資源(不支持瀏覽器操作)
DELETE: 刪除指定資源如何使一個(gè)方法返回多個(gè)數(shù)據(jù)(這些數(shù)據(jù)不在一個(gè)集合或者自定義對(duì)象中)
傳參指針變量的地址,方法內(nèi)部通過*運(yùn)算符使用該地址可以修改該地址保存的內(nèi)容(引用對(duì)象的地址),當(dāng)外部再次使用該指針變量取出引用對(duì)象時(shí),引用對(duì)象已經(jīng)在方法內(nèi)部發(fā)生了改變,指針變量指向其他數(shù)據(jù),相當(dāng)于方法的返回值(經(jīng)方法處理后生成的外部可使用的結(jié)果數(shù)據(jù)).(拓展)KVC可以修改只讀屬性嗎,為什么? KVC的查找順序是什么
KVC在某種程度上提供了訪問器的替代方案肩祥。不過訪問器方法是一個(gè)很好的東西后室,以至于只要是有可能,KVC也盡量再訪問器方法的幫助下工作混狠。為了設(shè)置或者返回對(duì)象屬性岸霹,KVC按順序使用如下技術(shù):
①檢查是否存在-<key>、-is<key>(只針對(duì)布爾值有效)或者-get<key>的訪問器方法将饺,如果有可能贡避,就是用這些方法返回值;
檢查是否存在名為-set<key>:的方法予弧,并使用它做設(shè)置值刮吧。對(duì)于 -get<key>和 -set<key>:方法,將大寫Key字符串的第一個(gè)字母掖蛤,并與Cocoa的方法命名保持一致杀捻;
②如果上述方法不可用,則檢查名為-_<key>蚓庭、-_is<key>(只針對(duì)布爾值有效)致讥、-_get<key>和-set<key>:方法;
③如果沒有找到訪問器方法彪置,可以嘗試直接訪問實(shí)例變量拄踪。實(shí)例變量可以是名為:<key>或<key>;
④如果仍為找到,則調(diào)用valueForUndefinedKey:和setValue:forUndefinedKey:方法拳魁。這些方法的默認(rèn)實(shí)現(xiàn)都是拋出異常惶桐,我們可以根據(jù)需要重寫它們。-
(拓展)TCP如何解決亂序和丟包問題,描述一下三次握手
TCP數(shù)據(jù)包的頭格式中有兩個(gè)概念,Sequence Number是數(shù)據(jù)包的序號(hào)潘懊,用來解決網(wǎng)絡(luò)包亂序(reordering)問題姚糊。Acknowledgement Number就是ACK——用于確認(rèn)收到,用來解決不丟包的問題授舟。
位碼即tcp標(biāo)志位救恨,有6種標(biāo)示:SYN(synchronous建立聯(lián)機(jī)) ACK(acknowledgement 確認(rèn)) PSH(push傳送) FIN(finish結(jié)束) RST(reset重置) URG(urgent緊急)Sequence number(順序號(hào)碼) Acknowledge number(確認(rèn)號(hào)碼).
SeqNum的增加是和傳輸?shù)淖止?jié)數(shù)相關(guān)的,TCP傳輸數(shù)據(jù)時(shí),如A主機(jī)第一次傳輸1440個(gè)字節(jié),seq=1,那么第二次時(shí)seq = 1441,B拼接數(shù)據(jù)就是根據(jù)seq進(jìn)行拼接的,seq數(shù)字不斷累加避免了亂序.B主機(jī)收到第一次數(shù)據(jù)包以后會(huì)返回ack = 1441.
A主機(jī)收到B的ack = 1441時(shí),就知道第一個(gè)數(shù)據(jù)包B已收到. 如果B沒有收到第一次的數(shù)據(jù)包,那么B再收到A的數(shù)據(jù)包時(shí),他就會(huì)發(fā)ack = 1回去,A收到B的回復(fù),發(fā)現(xiàn)B沒有收到第一次數(shù)據(jù)包,就會(huì)重發(fā)第一次數(shù)據(jù)包,這樣就可以防止丟包.
圖片 1.png
第一次握手:建立連接時(shí),客戶端發(fā)送syn包(syn=j)到服務(wù)器释树,并進(jìn)入SYN_SEND狀態(tài)肠槽,等待服務(wù)器確認(rèn)擎淤;
第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1)秸仙,同時(shí)自己也發(fā)送一個(gè)SYN包(syn=k)嘴拢,即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)寂纪;
第三次握手:客戶端收到服務(wù)器的SYN+ACK包席吴,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1),此包發(fā)送完畢捞蛋,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài)孝冒,完成三次握手。完成三次握手拟杉,客戶端與服務(wù)器開始傳送數(shù)據(jù).