iOS行業在經歷了過去幾年的爆發期後,如今到了一個相對冷靜的時期,一個良幣驅逐劣幣、去僞存真的階段。只有持續的專一和付出,纔可以在激烈的競爭中脫穎而出,成爲強者。正如狄更斯所言,「這是一個最壞的時代,也是最好的時代」 。面試
對於這些面試題,不要死記硬背,應該觸類旁通,深入理解實現機制(這也是科班和非科班的區別之一)。面試題答案只是參考,若有錯誤請指正。數據結構
若是讓你實現屬性的weak,如何實現的?
runtime
對註冊的類會進行佈局,對於weak
修飾的對象會放入一個hash
表中。用weak指向的對象內存地址做爲key,當此對象的引用計數爲0的時候會dealloc
,假如weak
指向的對象內存地址是a,那麼就會以a爲鍵在這個weak表中搜索,找到全部以a爲鍵的weak
對象,從而設置爲nil
。oop
若是讓你來實現屬性的atomic,如何實現?
- (void)setCurrentImage:(UIImage *)currentImage { @synchronized(self) { if (_currentImage != currentImage) { [_currentImage release]; _currentImage = [currentImage retain]; // do something } } } - (UIImage *)currentImage { @synchronized(self) { return _currentImage; } }
KVO爲何要建立一個子類來實現?
Runtime動態生成一個NSKVONotifying_Class子類,能夠動態地添加willChangeValueForKey
和didChangeValueForKey
觀察全部屬性的變化佈局
類結構體的組成,isa指針指向了什麼?(這裏應該將元類和根元類也說一下)
isa:是一個Class 類型的指針. 每一個實例對象有個isa的指針,他指向對象的類,而Class裏也有個isa的指針, 指向meteClass(元類)。元類保存了類方法的列表。當類方法被調用時,先會從自己查找類方法的實現,若是沒有,元類會向他父類查找該方法。同時注意的是:元類(meteClass)也是類,它也是對象。元類也有isa指針,它的isa指針最終指向的是一個根元類(root meteClass).根元類的isa指針指向自己,這樣造成了一個封閉的內循環。性能
RunLoop有幾種事件源?有幾種模式?
Runloop(消息循環)的目的:學習
1\. 基本做用:保持程序的持續運行,保證程序不退出 2\. 處理App中的各類事件(好比觸摸事件,定時器事件,Selector事件) 3\. 節省CPU資源,提升程序性能:該作事時作事,該休息是休息
方法列表的數據結構是什麼?
struct objc_method_list { struct objc_method_list* method_next; /* 這個變量用來連接另外一個單獨的方法鏈表 */ int method_count; /* 結構中定義的方法數量 */ struct objc_method method_list[1]; /* 可變長度的結構 */ };
分類是如何實現的?它爲何會覆蓋掉原來的方法?
由於分類方法加入類中這一操做是在運行期系統加載分類時完成的,運行期系統會把分類中所實現的每個方法都加入類的方法列表中atom
category的方法被放到了新方法列表的前面,而原來類的方法被放到了新方法列表的後面,因此category的方法會「覆蓋」掉原來類的同名方法。spa
但願我所分享的經驗能對您有所幫助,也但願您終能如願以償進入心儀的企業工做。指針
最後推薦個個人高級iOS交流羣:1001906160 ,有一個共同的圈子很重要,結識人脈!裏面都是iOS開發,全棧發展,歡迎入駐,共同進步!(羣內會免費提供一些羣主收藏的免費學習書籍資料以及整理好的幾百道面試題和答案文檔!)code