標籤:細節 number 基本使用 property .com markdown ref append 閱讀
你要知道的runtime都在這裡
轉載請註明出處 http://blog.csdn.net/u014205968/article/details/67639341
本文主要講解runtime相關知識,從原理到實踐,由於包含內容過多分為以下五篇文章詳細講解,可自行選擇需要瞭解的方向:
- 從runtime開始: 理解物件導向的類到面向過程的結構體
- 從runtime開始: 深入理解OC訊息轉寄機制
- 從runtime開始: 理解OC的屬性property
- 從runtime開始: 實踐Category添加屬性與黑魔法method swizzling
- 從runtime開始: 深入weak實現機理
本文是系列文章的第五篇文章,也是系列文章的最後一篇從runtime開始: 深入weak實現機理,本文主要講解runtime是如何?weak修飾符的。
weak修飾符我們一點也不陌生在開發中經常用到,最主要的作用是為了防止引用迴圈(retained cycle),經常用於block和delegate,在前面幾篇文章中已經講解了weak的基本使用和引用迴圈,如果有興趣可以參考文章iOS @property探究(一): 基礎詳解、iOS @property探究(二): 深入理解、iOS block探究(一): 基礎詳解、iOS block探究(二): 深入理解,相關方法和特點本文不再贅述了。
weak
weak不論是用作property修飾符還是用來修飾一個變數的聲明其作用是一樣的,就是不增加新對象的引用計數,被釋放時也不會減少新對象的引用計數,同時在新對象被銷毀時,weak修飾的屬性或變數均會被設定為nil,這樣可以防止野指標錯誤,本文要講解的也正是這個特性,runtime如何將weak修飾的變數的對象在銷毀時自動置為nil。
那麼runtime是如何?在weak修飾的變數的對象在被銷毀時自動置為nil的呢?一個普遍的解釋是:runtime對註冊的類會進行布局,對於weak修飾的對象會放入一個hash表中。用weak指向的對象記憶體位址作為key,當此對象的引用計數為0的時候會dealloc,假如weak指向的對象記憶體位址是a,那麼就會以a為鍵在這個weak表中搜尋,找到所有以a為鍵的weak對象,從而設定為nil。
瞭解了以上知識後就可以深入runtiem代碼來看看具體實現細節,有興趣的讀者可以繼續閱讀。
深入runtime理解weak備忘
由於作者水平有限,難免出現紕漏,如有問題還請不吝賜教。
iOS runtime探究(五): 從runtime開始深入weak實現機理