ARC
ARC 編譯器會自動插入對應的代碼,再結合Objective C的runtime,實現自動引用計數
retain的過程 —— 獲取全局的map( 叫做sideTable 對象的地址為key 引用計數的值為value ) 加鎖 引用計數器 + 1 解鎖
release —— 查找map,對引用計數減1,如果引用計數小于閾值,則調用dealloc
((void(*)(objc_object *, SEL))objc_msgSend)(this, SEL_dealloc)
autorelease ———把對象存儲到AutoreleasePoolPage的鏈表里。等到auto release pool被釋放的時候,把鏈表內存儲的對象刪除,所以AutoreleasePoolPage就是自動釋放池的內部實現
weak 有個全局的map 對象的地址為key weak修飾的對象的地址是value 對象釋放后 根據對象的地址可以找到對應的weak引用的地址,將其置為nil
block也是對象 背后的內存模型實際上是一個結構體,這個結構體會存儲一個函數指針來指向block的實際執行代碼
Runtime
Selector ——C的字符串
SEL 指向Selector的指針
IMP 指向函數體的函數指針
Method 指向OC方法的指針 包含 { SEL:methodname IMP:method_imp }
通過isa找到類 (類方法是找到類元metaClass)其中有SEL:IMP的表(method_list里面Method) 通過sel找到imp執行