在學生類中添加由strong、copy和weak修飾的屬性:
在。Clang編譯的cpp文件,生成三個對應的setter方法:
只是在setAge的方法調用中,是通過objc_setProperty方法實現的。
我們在objc-818.4的源代碼中搜索,看到了以下方法:
在objc源代碼中,沒有與setProperty相關的調用,那麽對於不同的修飾符,如何跳轉到對應的setProperty方法?我們打開llvm源代碼發現:
在llvm層,copy屬性實際上是編譯器優化的,然後會調用objc中的objc_setProperty_xxx方法。這裏定義的age屬性是用nonatomic和copy修飾的,所以name = " objc _ set property _ nonatomic _ copy "。
最後進入reallySetProperty流程,通過斷點調試可以看到:
從。cpp,我們可以看到用weak修飾的對象不會遵循上面的objc_setProperty方法,而是遵循objc源代碼中的objc_storeWeak來更新弱引用指針的指向。
運行時維護壹個弱表,用於存儲指向對象的所有弱指針。從源代碼來看,這個表其實是SideTables,是壹個哈希表。key是對象的地址,value是弱指針數組。
側表哈希表
RefcountMap是以DenseMap為模板創建的。這三個參數分別是哈希鍵類型、值類型和當value==0時是否自動釋放響應哈希節點。在這裏,這是真的。
Weak_table_t是壹個全局弱引用表,它將對象id存儲為鍵,將weak_entry_t存儲為它們的值。
在我們的App中,多個對象會重用同壹個SideTable節點,即weak_table會存儲多個對象的弱引用信息。所以在SideTable中,weak_table會作為哈希表再次存儲每個對象的弱引用信息。
清除取消分配
當壹個對象被釋放時,在調用clearDeallocating後將完成以下操作:
如果屬性用strong修飾,將調用objc_storeStrong方法來執行新值保留和舊值釋放。