main()之前的過程有哪些垃僚?
-
main之前的加載過程
1)dyld 開始將程序二進制文件初始化
2)交由ImageLoader 讀取 image提前,其中包含了我們的類伏蚊,方法等各種符號(Class巡通、Protocol 拦盹、Selector鹃祖、 IMP)
3)由于runtime 向dyld 綁定了回調(diào),當image加載到內(nèi)存后普舆,dyld會通知runtime進行處理
4)runtime 接手后調(diào)用map_images做解析和處理
5)接下來load_images 中調(diào)用call_load_methods方法恬口,遍歷所有加載進來的Class,按繼承層次依次調(diào)用Class的+load和其他Category的+load方法
6)至此 所有的信息都被加載到內(nèi)存中
7)最后dyld調(diào)用真正的main函數(shù)
sa指針沼侣?(對象的isa祖能,類對象的isa,元類的isa都要說)
對象的isa指針指向所屬的類
類的isa指針指向了所屬的元類
元類的isa指向了根元類蛾洛,根元類指向了自己养铸。
image
KVO基本原理?
1 )KVO是基于runtime機制實現(xiàn)的
2 )當某個類的屬性對象第一次被觀察時轧膘,系統(tǒng)就會在運行期動態(tài)地創(chuàng)建該類的一個派生類钞螟,在這個派生類中重寫基類中任何被觀察屬性的setter 方法。派生類在被重寫的setter方法內(nèi)實現(xiàn)真正的通知機制
3 )如果原類為Person谎碍,那么生成的派生類名為NSKVONotifying_Person
4 )每個類對象中都有一個isa指針指向當前類鳞滨,當一個類對象的第一次被觀察,那么系統(tǒng)會偷偷將isa指針指向動態(tài)生成的派生類椿浓,從而在給被監(jiān)控屬性賦值時執(zhí)行的是派生類的setter方法
5 )鍵值觀察通知依賴于NSObject 的兩個方法: willChangeValueForKey: 和 didChangevlueForKey:太援;在一個被觀察屬性發(fā)生改變之前闽晦, willChangeValueForKey:一定會被調(diào)用扳碍,這就 會記錄舊的值。而當改變發(fā)生后仙蛉,didChangeValueForKey:會被調(diào)用笋敞,繼而 observeValueForKey:ofObject:change:context: 也會被調(diào)用。