當前位置:成語大全網 - 書法字典 - IOS底層原則05-屬性關鍵字copy & amp;弱& ampStrongthe基礎分析

IOS底層原則05-屬性關鍵字copy & amp;弱& ampStrongthe基礎分析

上壹篇文章:iOS底層原則04-類結構

在學生類中添加由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方法來執行新值保留和舊值釋放。