1.KVO內部實現原則面試
回答:1>KVO是基於runtime機制實現的數組
2>當某個類的對象第一次被觀察時,系統就會在運行期動態地建立該類的一個派生類,在這個派生類中重寫基類中任何被觀察屬性的setter方法。異步
派生類在被重寫的setter方法實現真正的通知機制(Person->NSKVONOtifying Person)函數
Person類對象p設置self控制器且設置監聽屬性,就會調用observeValueForKeyPath方法,當Person類的屬性被改變時,就會動態生成一個子類繼承自Person類(NSKVONotifying_Person),重寫setAge方法,內部調用父類setAge方法,通知監聽器線程
[監聽器 observeValueForKeyPath:@"age" ofObject:self change:@{} context:(void *)context];設計
原先age屬性不改變時p對象 isa指向Person,當age屬性改變時p對象 isa指向NSKVONotifying_Person(setAge從新內部就會傳遞變量至父類且通知監聽器age屬性改變)3d
2.是否能夠把比較耗時的操做放在NSNotificationCenter中對象
回答:1>若是在異步發送通知,那麼能夠執行比較耗時的操做blog
2>若是在主線程發送通知,那麼就不能夠執行比較耗時的操做繼承
圖--2
圖---1
3.Foundation對象與Core Foundation對象有什麼區別
回答:1>Foundation對象是OC的,Core Foundation是C語言對象
2>Foundation對象和Core Foundation對象能夠互相轉換的,數據類型之間的轉換
ARC:__bridge_retained/__bridge_transfer
非ARC:__bridge
4.不用中間變量,用兩種方法交換A和B
回答:A= A + B
B= A -B
A = A - B
或者
A= A^B
B = A ^ B
A = A^B;
5.簡單描述下對單例模式設計的理解?
回答:節省內存資源,一個應用就一個對象
6.什麼是動態,舉例說明
1>在程序運行過程才執行的操做,例如KVO的內部實現原理,一個類的屬性值隨着程序運行監聽屬性值的變化
7.runtime實現機制是什麼,怎麼用,通常用於嘛,你還能記得你所使用的相關頭文件或者某些方法的名稱嗎?
回答:運行時機制,runtime庫裏面包含了跟類/成員變量/方法相關的API,好比獲取類裏面的全部成員變量,爲類動態添加成員變量,動態改變類的方法實現,爲類動態添加新的方法等,須要導入<objc/message.h><objc/runtime.h>
1>runtime,運行時機制,它是一套C語言庫
什麼是runtime?
2>實際上咱們編寫的全部OC代碼,最終都是轉成了runtime庫的東西,好比類轉成了runtime庫裏面的結構體等數據類型,方法轉成了runtime庫裏面的C語言函數,平時調方法都是轉成了objc_msgSend函數(因此說OC有個消息發送機制)
3>所以,能夠說runtime是OC的底層實現,是OC的幕後執行者
runtime有啥用?
1>能動態產生一個類、一個成員變量、一個方法
2>能動態修改一個類、一個成員變量、一個方法
3>能動態刪除一個類、一個成員變量、一個方法
常見的函數、頭文件
#import <objc/runtime.h> : 成員變量、類、方法
class_copyIvarList : 得到某個類內部的全部成員變量
class_copyMethodList : 得到某個類內部的全部方法
class_getInstanceMethod : 得到某個具體的實例方法(對象方法,減號開頭)
class_getClassMethod : 得到某個具體的類方法 (加號)
method_exchangeImplementations : 交換2個方法的實現
#import <objc/message.h> 消息機制
objc_msgSend(...);
圖解:平時用OC代碼設置變量值都轉成以下圖所示
圖解:runtime機制能夠看到很底層的實現,甚至成員變量是私有的。
圖解:runtime實現遍歷全部成員變量
圖解:使用runtime機制,UIImage類交換2個方法的實現(imageWithName和imageNamed)
可是若是在imageWithName方法內在調用imageNamed就會致使死循環。
交換2個方法的好處:之後一個大項目當中的一個方法使用過多,想動一些手腳和操做,就能夠很方便實現。
圖解:修改addObject方法不爲空才添加到數組
圖解:修改objectAtIndex方法並查看是否越界,如越界返回null,runtime還可防止程序崩潰
附註:self.book[4]執行實際調用objectAtindex方法。