1、 你使用過Objective-C的運(yùn)行時(shí)編程(Runtime Programming)么镀首?如果使用過坟漱,你用它做了什么?你還能記得你所使用的相關(guān)的頭文件或者某些方法的名稱嗎更哄?
Objecitve-C的重要特性是Runtime(運(yùn)行時(shí)),在#import
<objc/runtime.h> 下能看到相關(guān)的方法芋齿,用過objc_getClass()和class_copyMethodList()獲取過私有API;使用
Method method1 = class_getInstanceMethod(cls, sel1);
Method method2 = class_getInstanceMethod(cls, sel2);
method_exchangeImplementations(method1,
method2);
代碼交換兩個(gè)方法,在寫unit test時(shí)使用到成翩。
2觅捆、 對(duì)于Objective-C,你認(rèn)為它最大的優(yōu)點(diǎn)和最大的不足是什么捕传?對(duì)于不足之處惠拭,現(xiàn)在有沒有可用的方法繞過這些不足來實(shí)現(xiàn)需求。如果可以的話庸论,你有沒有考慮或者實(shí)踐過重新實(shí)現(xiàn)OC的一些功能职辅,如果有,具體會(huì)如何做聂示?
最大的優(yōu)點(diǎn)是它的運(yùn)行時(shí)特性域携,不足是沒有命名空間,對(duì)于命名沖突鱼喉,可以使用長命名法或特殊前綴解決秀鞭,如果是引入的第三方庫之間的命名沖突趋观,可以使用link命令及flag解決沖突。
3锋边、 你用過NSOperationQueue么皱坛?如果用過或者了解的話,你為什么要使用NSOperationQueue豆巨,實(shí)現(xiàn)了什么剩辟?請描述它和GCD的區(qū)別和類似的地方(提示:可以從兩者的實(shí)現(xiàn)機(jī)制和適用范圍來描述)。
使用NSOperationQueue用來管理子類化的NSOperation對(duì)象往扔,控制其線程并發(fā)數(shù)目贩猎。GCD和NSOperation都可以實(shí)現(xiàn)對(duì)線程的管理,區(qū)別是NSOperation和NSOperationQueue是多線程的面向?qū)ο蟪橄笃继拧m?xiàng)目中使用NSOperation的優(yōu)點(diǎn)是NSOperation是對(duì)線程的高度抽象吭服,在項(xiàng)目中使用它,會(huì)使項(xiàng)目的程序結(jié)構(gòu)更好蝗罗,子類化NSOperation的設(shè)計(jì)思路艇棕,是具有面向?qū)ο蟮膬?yōu)點(diǎn)(復(fù)用、封裝)绿饵,使得實(shí)現(xiàn)是多線程支持欠肾,而接口簡單瓶颠,建議在復(fù)雜項(xiàng)目中使用拟赊。
項(xiàng)目中使用GCD的優(yōu)點(diǎn)是GCD本身非常簡單、易用粹淋,對(duì)于不復(fù)雜的多線程操作吸祟,會(huì)節(jié)省代碼量,而Block參數(shù)的使用桃移,會(huì)是代碼更為易讀屋匕,建議在簡單項(xiàng)目中使用。
更詳細(xì)的答案見我的這篇文章
4借杰、NSNotification和KVO的區(qū)別和用法是什么过吻?什么時(shí)候應(yīng)該使用通知,什么時(shí)候應(yīng)該使用KVO蔗衡,它們的實(shí)現(xiàn)上有什么區(qū)別嗎纤虽?如果用protocol和delegate(或者delegate的Array)來實(shí)現(xiàn)類似的功能可能嗎?如果可能绞惦,會(huì)有什么潛在的問題逼纸?如果不能,為什么济蝉?(雖然protocol和delegate這種東西面試已經(jīng)面爛了…)
NSNotification是通知模式在iOS的實(shí)現(xiàn)杰刽,KVO的全稱是鍵值觀察(Key-value
observing),其是基于KVC(key-value coding)的菠发,KVC是一個(gè)通過屬性名訪問屬性變量的機(jī)制。例如將Module層的變化贺嫂,通知到多個(gè)Controller對(duì)象時(shí)滓鸠,可以使用NSNotification;如果是只需要觀察某個(gè)對(duì)象的某個(gè)屬性第喳,可以使用KVO哥力。
對(duì)于委托模式,在設(shè)計(jì)模式中是對(duì)象適配器模式墩弯,其是delegate是指向某個(gè)對(duì)象的吩跋,這是一對(duì)一的關(guān)系,而在通知模式中渔工,往往是一對(duì)多的關(guān)系锌钮。委托模式,從技術(shù)上可以現(xiàn)在改變delegate指向的對(duì)象引矩,但不建議這樣做梁丘,會(huì)讓人迷惑,如果一個(gè)delegate對(duì)象不斷改變旺韭,指向不同的對(duì)象氛谜。
5、如何把一張大圖縮小為1/4大小的縮略圖区端?
let data = UIImageJPEGRepresentation(image, 0.25)
6值漫、NSOperation 相比于GCD 有哪些優(yōu)勢?
提供了在GCD 中不那么容易復(fù)制的有用特性织盼。
可以很方便的取消一個(gè)NSOperation的執(zhí)行
可以更容易的添加任務(wù)的依賴關(guān)系
提供了任務(wù)的狀態(tài):isExecuteing, isFinished.
7杨何、SDWebImage具體如何實(shí)現(xiàn)?
其實(shí)就是沙盒緩存機(jī)制沥邻,主要由三塊組成:內(nèi)存圖片緩存危虱,內(nèi)存操作緩存,磁盤沙盒緩存唐全。
①埃跷、利用NSOperationQueue和NSOperation下載圖片,還使用了GCD(解析GIF圖片)邮利。
②弥雹、利用URL作為key,NSOperation作為value.
③近弟、利用URL作為key缅糟,UIImage作為value
8、AFNetWorking實(shí)現(xiàn)原理祷愉。
基于NSURL.采用block的方法處理請求窗宦,直接返回的是json赦颇、XML數(shù)據(jù)。AFN直接操作對(duì)象是AFHTTPClient,是一個(gè)實(shí)現(xiàn)了NSCoding和NSCopying協(xié)議的NSObject子類赴涵。AFGTTPClient是一個(gè)封裝了一系列操作方法的工具類媒怯。AFN默認(rèn)沒有封裝同步請求,如果開發(fā)者需要使用同步請求髓窜,需要重寫相關(guān)的方法(getPath:parameters:failure)扇苞,對(duì)AFHTTPRequestOperation進(jìn)行同步處理。
9寄纵、App需要加載大量數(shù)據(jù)鳖敷,給服務(wù)器發(fā)送請求,但是服務(wù)器卡住了怎么辦程拭?
設(shè)置請求超時(shí)定踱,給用戶提示請求超時(shí),根據(jù)用戶操作再次請求恃鞋。
10崖媚、有些圖片加載比較慢怎么處理?你是怎么優(yōu)化程序的性能的恤浪?
①畅哑、圖片下載放在異步線程。
②水由、圖片下載過程使用占位圖片
③荠呐、如果圖片比較大,可以使用多線程斷點(diǎn)下載绷杜。
11直秆、怎么解決緩存池滿的問題?
iOS中不存在緩存池滿的情況鞭盟,通常在對(duì)象需要?jiǎng)?chuàng)建時(shí)才創(chuàng)建,比如UITableView中一般只會(huì)創(chuàng)建剛開始在屏幕中的cell瑰剃,之后都是從緩存池里取齿诉,不會(huì)再創(chuàng)建新對(duì)象。
12晌姚、控制器View的生命周期及相關(guān)函數(shù)是什么粤剧?你在開發(fā)中是如何使用的?
1挥唠、首先判斷控制器是否有視圖抵恋,如果沒有就調(diào)用loadView方法創(chuàng)建:通過storyBoard或者代碼。
2宝磨、隨后調(diào)用viewDidLoad弧关,可以進(jìn)行下一步的初始化操作盅安,只會(huì)被調(diào)用一次。
3世囊、在視圖顯示之前調(diào)用viewWillAppear,該函數(shù)可以多次調(diào)用别瞭。
4、視圖viewDidAppear
5株憾、在布局變化前后蝙寨,調(diào)用viewWill/DidLayoutSubViews處理相關(guān)信息。
13嗤瞎、是否使用Core Text 或者Core Image 墙歪?
Core Text
隨意修改文本的樣式
圖文混排(純C語言)
Core Image(濾鏡處理)
能夠調(diào)節(jié)圖片的各種屬性(對(duì)比度、色溫贝奇、色差等)
14箱亿、你實(shí)現(xiàn)過多線程的Core Data么?NSPersistentStoreCoordinator,NSManagedObjectContext和NSManagedObject中的哪些需要在線程中創(chuàng)建或者傳遞?你是用什么樣的策略來實(shí)現(xiàn)的?
15弃秆、 您是否做過異步的網(wǎng)絡(luò)處理和通訊方面的工作届惋?如果有,能具體介紹一些實(shí)現(xiàn)策略么菠赚?