目錄
1.你使用過(guò)Objective-C的運(yùn)行時(shí)編程(Runtime Programming)么壮啊?如果使用過(guò),你用它做了什么?你還能記得你所使用的相關(guān)的頭文件或者某些方法的名稱嗎?
Objecitve-C的重要特性是Runtime(運(yùn)行時(shí)),在#import <objc/runtime.h>下能看到相關(guān)的方法炊琉,用過(guò)objc_getClass()和class_copyMethodList()獲取過(guò)私有API;
使用
Method method1 = class_getInstanceMethod(cls, sel1);
Method method2 = class_getInstanceMethod(cls, sel2);
method_exchangeImplementations(method1, method2);
2.你實(shí)現(xiàn)過(guò)多線程的Core Data么?NSPersistentStoreCoordinator又活,NSManagedObjectContext和NSManagedObject中的哪些需要在線程中創(chuàng)建或者傳遞苔咪?你是用什么樣的策略來(lái)實(shí)現(xiàn)的?
待整理柳骄!
3.Core開(kāi)頭的系列的內(nèi)容团赏。是否使用過(guò)CoreAnimation和CoreGraphics。UI框架和CA耐薯,CG框架的聯(lián)系是什么舔清?分別用CA和CG做過(guò)些什么動(dòng)畫或者圖像上的內(nèi)容。(有需要的話還可以涉及Quartz的一些內(nèi)容)
待整理
4.是否使用過(guò)CoreText或者CoreImage等曲初?如果使用過(guò)体谒,請(qǐng)談?wù)勀闶褂肅oreText或者CoreImage的體驗(yàn)。
-
CoreText
可以解決復(fù)雜文字內(nèi)容排版問(wèn)題臼婆。 -
CoreImage
可以處理圖片抒痒,為其添加各種效果。體驗(yàn)是很強(qiáng)大颁褂,挺復(fù)雜的故响。
5.NSNotification和KVO的區(qū)別和用法是什么?什么時(shí)候應(yīng)該使用通知痢虹,什么時(shí)候應(yīng)該使用KVO被去,它們的實(shí)現(xiàn)上有什么區(qū)別嗎?如果用protocol和delegate(或者delegate的Array)來(lái)實(shí)現(xiàn)類似的功能可能嗎奖唯?如果可能,會(huì)有什么潛在的問(wèn)題糜值?如果不能丰捷,為什么?(雖然protocol和delegate這種東西面試已經(jīng)面爛了…)
-
NSNotification
是通知模式在iOS的實(shí)現(xiàn) -
KVO
的全稱是鍵值觀察(Key-value observing),其是基于KVC(key-value coding)的 -
KVC
是一個(gè)通過(guò)屬性名訪問(wèn)屬性變量的機(jī)制寂汇。 - 例如將Module層的變化病往,通知到多個(gè)Controller對(duì)象時(shí),可以使用NSNotification骄瓣;如果是只需要觀察某個(gè)對(duì)象的某個(gè)屬性停巷,可以使用KVO。
6.你用過(guò)NSOperationQueue么?如果用過(guò)或者了解的話畔勤,你為什么要使用NSOperationQueue蕾各,實(shí)現(xiàn)了什么?請(qǐng)描述它和GCD的區(qū)別和類似的地方(提示:可以從兩者的實(shí)現(xiàn)機(jī)制和適用范圍來(lái)描述)庆揪。
NSOperationQueue
- 使用NSOperationQueue用來(lái)管理子類化的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)是多線程支持,而接口簡(jiǎn)單负懦,建議在復(fù)雜項(xiàng)目中使用筒捺。
GCD
項(xiàng)目中使用GCD的優(yōu)點(diǎn)是GCD本身非常簡(jiǎn)單、易用纸厉,對(duì)于不復(fù)雜的多線程操作系吭,會(huì)節(jié)省代碼量,而B(niǎo)lock參數(shù)的使用颗品,會(huì)是代碼更為易讀肯尺,建議在簡(jiǎn)單項(xiàng)目中使用。
5.既然提到GCD躯枢,那么問(wèn)一下在使用GCD以及block時(shí)要注意些什么则吟?它們兩是一回事兒么?block在ARC中和傳統(tǒng)的MRC中的行為和用法有沒(méi)有什么區(qū)別锄蹂,需要注意些什么氓仲?如何避免循環(huán)引用?
- 使用block是要注意得糜,若將block做函數(shù)參數(shù)時(shí)敬扛,需要把它放到最后
- GCD是Grand Central Dispatch,是一個(gè)對(duì)線程開(kāi)源類庫(kù)朝抖,而B(niǎo)lock是閉包啥箭,是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)
7.您是否做過(guò)異步的網(wǎng)絡(luò)處理和通訊方面的工作?如果有治宣,能具體介紹一些實(shí)現(xiàn)策略么急侥?
待整理
8.對(duì)于Objective-C砌滞,你認(rèn)為它最大的優(yōu)點(diǎn)和最大的不足是什么?對(duì)于不足之處坏怪,現(xiàn)在有沒(méi)有可用的方法繞過(guò)這些不足來(lái)實(shí)現(xiàn)需求贝润。如果可以的話,你有沒(méi)有考慮或者實(shí)踐過(guò)重新實(shí)現(xiàn)OC的一些功能陕悬,如果有题暖,具體會(huì)如何做?
- 最大的優(yōu)點(diǎn)是它的運(yùn)行時(shí)特性
- 不足是沒(méi)有命名空間捉超,對(duì)于命名沖突胧卤,可以使用長(zhǎng)命名法或特殊前綴解決,如果是引入的第三方庫(kù)之間的命名沖突拼岳,可以使用link命令及flag解決沖突枝誊。
9.如何獲取通訊錄數(shù)據(jù)
從通訊錄數(shù)據(jù)庫(kù)查詢聯(lián)系人數(shù)據(jù)是無(wú)法使用SQL語(yǔ)句,只能通過(guò)ABAddressBookCopyArrayOfAllPeople惜纸、ABAddressBookCopyPeopleWithName來(lái)獲得叶撒。ABAddressBookCopyArrayOfAllPeople函數(shù)是通過(guò)人名查詢通訊錄中的聯(lián)系人,其中的name參數(shù)是查詢的前綴關(guān)鍵字耐版。
10.NSURLConnection類的同步請(qǐng)求方法?
A.+sendSynchronousRequest:returningResponse:error:
B.-initWithRequest:delegate:
C.-initWithRequest:delegate:startImmediately:
理解:B和C都是異步方法祠够,需要設(shè)置delegate屬性。
10.genstrings命名的語(yǔ)法
genstrings [-a] [-q] [-o <outputDir>] sourcefile
其中參數(shù):
-a:在存在的文件后面追加內(nèi)容粪牲;
-q:關(guān)閉多個(gè)鍵值對(duì)的警告古瓤;
-o:指定輸出目錄
因此如果我們想輸出到en.lproj目錄,則代碼如下:
genstrings -o en.lproj *.m
11.判斷是否為iPad設(shè)備
if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad){....}
12.Objective-C有哪幾種內(nèi)存管理方法腺阳?
-
MRR(Manual Retain Release)
- MRC的官方名字落君; -
MRC(Manual Reference Counting )
- 手動(dòng)引用計(jì)數(shù); -
ARC(Automatic Reference Counting)
- 自動(dòng)引用計(jì)數(shù)亭引; -
GC(Garbage Collection)
- 是垃圾回收(在開(kāi)發(fā)OS X中使用)
13.iOS中持久化方式有哪些绎速?
- 屬性列表文件
- 對(duì)象歸檔
- SQLite數(shù)據(jù)庫(kù)
- CoreData
14.關(guān)于類別的理解
類別是一種為現(xiàn)有的類添加新方法的方式。利用Objective-C的動(dòng)態(tài)運(yùn)行時(shí)分配機(jī)制焙蚓,Category提供了一種比繼承更為簡(jiǎn)潔的方法來(lái)對(duì)class進(jìn)行擴(kuò)展纹冤,無(wú)需創(chuàng)建對(duì)象類的子類就能為現(xiàn)有的類添加新方法,可以為任何已經(jīng)存在的class添加方法购公,包括那些沒(méi)有源代碼的類(比如某些框架類)赵哲,但不能刪除修改之前的方法。
類別主要有3個(gè)作用:
可以將類的實(shí)現(xiàn)分散到多個(gè)不同文件或多個(gè)不同框架中君丁,方便代碼管理。也可以對(duì)框架提供類的擴(kuò)展(沒(méi)有源碼将宪,不能修改)绘闷。
創(chuàng)建對(duì)私有方法的前向引用橡庞。如果其他類中的方法未實(shí)現(xiàn),在你訪問(wèn)其他類的私有方法時(shí)編譯器報(bào)錯(cuò)印蔗。這時(shí)使用類別扒最,在類別中聲明這些方法(不必提供方法實(shí)現(xiàn)),編譯器就不會(huì)產(chǎn)生警告华嘹。
向?qū)ο筇砑臃钦絽f(xié)議:創(chuàng)建一個(gè)NSObject的類別成為“創(chuàng)建一個(gè)非正式協(xié)議”吧趣,因?yàn)榭梢宰鳛槿魏晤惖奈袑?duì)象使用。
15.NSRunLoop的以下描述錯(cuò)誤的是
A. RunLoop并不是由系統(tǒng)自動(dòng)控制的耙厚;
B.有3類對(duì)象可以被run loop監(jiān)控:sources强挫,timer,observers
C.線程是默認(rèn)啟動(dòng)run loop的;
D.NSTimer可手動(dòng)添加到新建的NSRunLoop中薛躬。
理解
A
:Runloop的作用在于當(dāng)有事情要做時(shí)它使當(dāng)前的thread工作俯渤,沒(méi)有事情做時(shí)又使thread休眠。Runloop并不是由系統(tǒng)自動(dòng)控制的型宝,尤其是對(duì)那些新建的次線程需要對(duì)其進(jìn)行顯示的控制八匠。B
:有三類對(duì)象可以被run loop監(jiān)控,source趴酣,timer梨树,observers。C
:每一個(gè)線程都有自己的runloop岖寞,主線程是默認(rèn)開(kāi)啟的抡四,創(chuàng)建的子線程是要手動(dòng)開(kāi)啟的,因?yàn)镹SApplication只啟動(dòng)main application thread.D
:NSTimer默認(rèn)添加到當(dāng)前NSRunLoop中慎璧,也可以手動(dòng)指定添加到自己新建的NSRunLoop中床嫌。
16.常用的設(shè)計(jì)模式
- 單例模式
- 組合模式
- 觀察者模式
- 代理模式
- 享元模式
- 工廠方法模式
- 抽象工廠模式
17.MVC的理解
數(shù)據(jù)管理者(M)、數(shù)據(jù)展示者(V)胸私、數(shù)據(jù)加工者(C)
- M應(yīng)該做的事:
- 給ViewController提供數(shù)據(jù)
- 給ViewController存儲(chǔ)數(shù)據(jù)提供接口
- 提供經(jīng)過(guò)抽象的業(yè)務(wù)基本組件厌处,供Controller調(diào)度
- C應(yīng)該做的事:
- 管理View Container的生命周期
- 負(fù)責(zé)生成所有的View實(shí)例,并放入View Container
- 監(jiān)聽(tīng)來(lái)自View與業(yè)務(wù)有關(guān)的事件岁疼,通過(guò)與Model的合作阔涉,來(lái)完成對(duì)應(yīng)事件的業(yè)務(wù)。
- V應(yīng)該做的事:
- 響應(yīng)與業(yè)務(wù)無(wú)關(guān)的事件捷绒,并因此引發(fā)動(dòng)畫效果瑰排,點(diǎn)擊反饋(如果合適的話,盡量還是放在View去做)等暖侨。
- 界面元素表達(dá)
18.MVC和MVVM的區(qū)別
- MVVM是對(duì)胖模型進(jìn)行的拆分椭住,其本質(zhì)是給控制器減負(fù),將一些弱業(yè)務(wù)邏輯放到VM中處理
- MVC是一切設(shè)計(jì)的基礎(chǔ)字逗,所有新的設(shè)計(jì)模式都是基于MVC進(jìn)行的改進(jìn)
- 補(bǔ)充:常見(jiàn)的設(shè)計(jì)模式有:MVC京郑、MVCS宅广、MVVM、viper
19.TCP和UDP有什么區(qū)別些举?
- TCP是面向連接的跟狱,建立連接需要經(jīng)歷三次握手,保證數(shù)據(jù)正確性和數(shù)據(jù)順序
- UDP是非連接的協(xié)議户魏,傳送數(shù)據(jù)受生成速度驶臊,傳輸帶寬等限制,可能造成丟包
- UDP一臺(tái)服務(wù)端可以同時(shí)向多個(gè)客戶端傳輸信息
- TCP報(bào)頭體積更大叼丑,對(duì)系統(tǒng)資源要求更多
20.TCP的三次握手
- 第一次握手:客戶端發(fā)送syn包到服務(wù)器关翎,并進(jìn)入
syn_send
狀態(tài),等待服務(wù)器進(jìn)行確認(rèn)幢码; - 第二次握手:服務(wù)器收到客戶端的syn包笤休,必須確認(rèn)客戶的SYN,同時(shí)自己也發(fā)送一個(gè)SYN包,即SYN + ACK包症副,此時(shí)服務(wù)器進(jìn)入
SYN_RECV
狀態(tài); - 第三次握手:客戶收到服務(wù)器發(fā)送的SYN+ACK包之后店雅,向服務(wù)器發(fā)送確認(rèn)包,此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入
ESTABLISHED
狀態(tài)贞铣,完成第三次握手闹啦。
21.如何制作一個(gè)靜態(tài)庫(kù)/動(dòng)態(tài)庫(kù)?他們的區(qū)別是什么辕坝?
- Xcode6支持制作靜態(tài)庫(kù)/動(dòng)態(tài)庫(kù)framework
- 無(wú)論是動(dòng)態(tài)庫(kù)還是靜態(tài)庫(kù)都是區(qū)分真機(jī)和模擬器的
- 靜態(tài)庫(kù)編譯靜態(tài)庫(kù)文件裝入程序空間窍奋,動(dòng)態(tài)庫(kù)是文件動(dòng)態(tài)裝入內(nèi)存
- 動(dòng)態(tài)庫(kù)執(zhí)行到相關(guān)函數(shù)才會(huì)被調(diào)用,節(jié)省空間
- 蘋果一般不允許第三方動(dòng)態(tài)庫(kù)酱畅,APP容易被拒
- 一個(gè)lib包含了很多的架構(gòu)琳袄,會(huì)打到最后的包里么?
- 不會(huì)纺酸,如果lib中有armv7, armv7s, arm64, i386,x86_64架構(gòu)窖逗,而target architecture選擇了armv7s,arm64,那么只會(huì)從lib中l(wèi)ink指定的這兩個(gè)架構(gòu)的二進(jìn)制代碼餐蔬,其他架構(gòu)下的代碼不會(huì)link到最終可執(zhí)行文件中碎紊;反過(guò)來(lái),一個(gè)lib需要在模擬器環(huán)境中正常link樊诺,也得包含i386架構(gòu)的指令
每一個(gè)設(shè)備都有屬于自己的CPU架構(gòu)
每一個(gè)靜態(tài)支持的架構(gòu)是固定
-
模擬器
- 4s-->5 : i386
- 5s-->6plus : x86_64
-
真機(jī)
- 3gs-->4s : armv7
- 5/5c : armv7s,靜態(tài)庫(kù)只要支持了armv7,就可以跑在armv7s的架構(gòu)上
- 5s-->6plus : arm64
常用命令總結(jié):
使用lipo -info命令仗考,查看指定庫(kù)支持的架構(gòu),比如UIKit框架
lipo -info UIKit.framework/UIKit
想看的更詳細(xì)的信息可以使用lipo -detailed_info
lipo -detailed_info UIKit.framework/UIKit
還可以使用file命令
file UIKit.framework/UIKit
合并MyLib-32.a和MyLib-64.a词爬,可以使用lipo -create命令合并
lipo -create MyLib-32.a MyLib-64.a -output MyLib.a
22.支持64-bit后程序包會(huì)變大么秃嗜?
會(huì),支持64-bit后,多了一個(gè)arm64架構(gòu)痪寻,理論上每個(gè)架構(gòu)一套指令螺句,但相比原來(lái)會(huì)大多少還不好說(shuō)
23.用過(guò)Core Data或者SQLite嗎?讀寫是分線程的嗎橡类?遇到過(guò)死鎖沒(méi)?如何解決的芽唇?
- 用過(guò)SQLite顾画,使用FMDB框架
- 丟給FMDatabaseQueue或者 添加互斥鎖(NSLock/@synchronized(鎖對(duì)象))
24.APNS的原理:
- 應(yīng)用在通知中心注冊(cè),由iOS系統(tǒng)向APNS請(qǐng)求返回設(shè)備令牌(device Token)
- 應(yīng)用程序接收到設(shè)備令牌并發(fā)送給自己的后臺(tái)服務(wù)器
- 服務(wù)器把要推送的內(nèi)容和設(shè)備發(fā)送給APNS
- APNS根據(jù)設(shè)備令牌找到設(shè)備匆笤,再由iOS根據(jù)APPID把推送內(nèi)容展示