iOS開發-Runtime是如何?weak屬性的?

來源:互聯網
上載者:User

weak屬性的特點:
weak 表明該屬性定義了一種“非擁有關係” (nonowning relationship)。
為weak屬性設定新值時,設定方法既不保留新值,也不釋放舊值。
同assign類似,然而在屬性所指的對象釋放時候,屬性值也會清空(nil out)。

runtime是如何? weak 變數的自動置nil。

weak 對象會放入一個 hash 表中。
用 weak 指向的對象記憶體位址作為 key,當此對象的引用計數為0的時候會 dealloc。
假如 weak 指向的對象記憶體位址是addr,那麼就會以addr為鍵, 在這個 weak 表中搜尋,找到所有以addr為鍵的 weak 對象,從而設定為 nil。

具體機制:

objc_storeWeak(&weakPo, Model)函數:

objc_storeWeak函數把賦值對象(Model)的記憶體位址作為索引值key,將weak修飾的屬性變數(weakPo)的記憶體位址(& weakPo)作為value,註冊到 weak 表中。

如果Model為0(nil),那麼把變數(weakPo)的記憶體位址(& weakPo)從weak表中刪除,

可以把objc_storeWeak(&weakPo, Model)理解為:objc_storeWeak(value, key),並且當key變nil,將value置nil。

在Model非nil時,weakPo和Model指向同一個記憶體位址,在Model變nil時,weakPo變nil。此時向weakPo發送訊息不會崩潰:在Objective-C中向nil發送訊息是安全的。

具體過程objc/objc-weak.h代碼連結

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.