arc,顧名思義,automatic reference count,也就是自動引用計數。它是相對mrc(手動引用計數)而言的。當時不管是arc還是mrc,都應該嚴格遵守objective-c記憶體管理的基本原則:
__strong修飾符
__strong修飾符是預設的修飾符。這樣不管是alloc/new/copy/mutablecopy還是其他方式獲得的物件,由於是強引用,編譯器會自動幫我們呼叫物件的release函式,不需要手工維護。
__weak修飾符
大部分場合只要使用 __strong來編碼就夠了,但是當遇到了迴圈引用問題的時候,就需要用到__weak修飾符了。__weak宣告的變數其實是放到乙個weak表中,該錶和引用計數的**類似,是乙個hash表,都是以物件的記憶體位址為key,同時,針對乙個物件位址的key,可以同時對應多個變數的位址。當乙個__weak所指的物件被釋放時,遵從以下步驟:1.從weak表中,通過物件位址(key)找到entry;2.將entry中所有指向該物件的變數設為nil;3.從weak表中刪除該entry; 4.從物件引用計數表中刪除物件entry(通過物件位址找到)。另外,當使用__weak修飾的變數時,變數將放入autoreleasepool中,並且用幾次放幾次。
__autoreleasing修飾符
__aytoreleasing不怎麼常見,因為編譯器都幫我們做了隱式的使用。例如:
id *obj 等價於 id __autoreleasing *obj
__unsafe_unretained修飾符
__unsafe_unretained主要是為了在arc時代相容ios4及以下版本,因為這些版本沒有弱引用機制。其功能和assign類似,當指向的物件被釋放後,依然指向原來的位址,不會被置為nil。因此會變成野指標。
ARC學習筆記
1.arc並不是自動管理記憶體,與autoreleasepool不同,arc是llvm 3.0編譯器提供的特性,編譯器自動在適當的地方插入retain release autorelease,所以還是手動管理記憶體,物件不會像autoreleasepool一樣在記憶體中存放很久。2.arc只能工作於...
ios筆記 ARC筆記
arc知識介紹 1 概念 arc的全稱是 automatic reference counting 自動引用計數 是自ios5 之後增加的新特性,編譯器會自動在合適的地方插入適當的retain release autorelease 語句,會自動生成記憶體管理的 不用程式設計師手動編寫。2 如果是手...
原 iOS學習之ARC和非ARC檔案混編
在程式設計過程中,我們會用到很多各種各樣的他人封裝的第三方 但是有很多第三方都是在非arc情況下執行的,當你使用第三方編譯時出現和下圖類似的錯誤,就說明該第三方是非arc的,需要進行一些配置。解決方法 蘋果文件transitioning to arc release notes有一種解決辦法為 us...