OC閱讀筆記十三 ARC 下

2021-07-10 23:55:38 字數 575 閱讀 3473

在方法中返回自動釋放物件的時候,會呼叫objc_autoreleasereturnvalue函式檢測返回的物件是否執行retain操作,如果執行就設定全域性資料結構的乙個標誌位.而不執行autorelease操作.

與之相似,如果呼叫方法的**要保留此物件,則呼叫objc_retainautoreleasedreturnvalue函式,檢測剛剛的標誌位,若已經置位,則不執行retain操作.因為arc也包含執行期元件,所以這方面的優化很有意義.

在非arc環境下,如果set方法的新值與舊值相同,而先釋放舊值再保留新值很可能會提前**物件導致程式崩潰,而arc會用保留新值,釋放舊值的方式來保證安全,避免出現邊界情況.

由於block會自動保留捕獲的全部物件,可能其中的物件又保留了block本身,這時可以用__weak區域性變數來打破保留環.

arc下,非objectiv-c物件(比如corefoundation)仍然需要手動清理,由於不能直接呼叫dealloc,需通過cfrelease()和cfretain().

在arc下,不可覆寫記憶體管理方法,這麼做會干擾arc分析物件生命期的工作,以及對各種操作的優化,比如前面提到的自動釋放後保留物件的操作會被簡化.

OC閱讀筆記九 分類 下

除了 class continuation 之外的分類定義屬性都無法向類中新增例項變數.如果必要,可以用 dynamic宣告,然後使用訊息 機制在執行期攔截方法呼叫,提供實現方法.關聯物件能解決分類不能合成例項變數的問題,但容易在記憶體管理問題上出錯.一般最好的作法是將所有屬性都定義在主介面.在 c...

ARC下OC物件與CF物件橋接

bridge 不涉及物件所有關係改變 bridge transfer 給予 arc 所有權 bridge retained 解除 arc 所有權 在arc中,oc物件與非oc物件在強制轉換中,需要使用以上三個關鍵字進行橋接,那麼三個關鍵字各用在什麼情況下呢?詳解如下 下面一行 cfstringref...

OC中非ARC環境下的記憶體管理小記

一 計數器的基本操作 1 retain 1 2 release 1 3 retaincount 獲得計數器的值 二 set方法的記憶體管理 1 set方法的實現 void setcar car car if car car car release car car 2 dealloc方法的實現 不要直...