ARC學習筆記

2022-08-10 02:42:10 字數 3705 閱讀 9172

1. arc並不是自動管理記憶體,與autoreleasepool不同,arc是llvm 3.0編譯器提供的特性,編譯器自動在適當的地方插入retain、release、autorelease,所以還是手動管理記憶體,物件不會像autoreleasepool一樣在記憶體中存放很久。

2. arc只能工作於objective-c物件,如果應用使用了core foundation或malloc()/free(),此時需要你來管理記憶體。

3. 雖然arc管理retain和release,但並不表示不需要處理記憶體問題,strong指標會保持物件的生命,所以有時候為了**記憶體,自己要將其設為nil,以便釋放記憶體,否則記憶體可能會被用光。

4. property的修飾符有一定變化。a)strong等同於retain;b)weak是弱指標,當物件釋放時會自動設定為nil;c)unsafe_unretained等同於assign只有ios4才應該使用;d)copy和以前的copy一樣,複製乙個物件並建立strong關聯;e)assign不能用於物件,應該用於bool、int和float等值型別。

5. 如果dealloc方法只是釋放物件,則不需要此方法,但如果dealloc中處理了其它非記憶體資源釋放,如定時器、core foundation物件,則仍然需要在dealloc方法中進行手動釋放,但不能呼叫[super dealloc]。

6. 由於arc只作用於objective-c物件,有時候要用到core foundation物件,兩者之間的轉換可以使用toll-free bridging來很方便地完成,例如nsstring和cfstringref。編譯器必須知道由誰來負責釋放轉換後的物件,如果你把乙個objective-c物件當作core foundation物件來使用,arc將不再負責釋放該物件,在兩種物件之間進行轉換時,要顯示地移交或者接受權利。

7. 函式引數和區域性變數一樣,都是strong指標,這種物件在函式入口處會被retain,並且物件會持續存在直到指標被銷毀。

8.

1 - (nsstring *)escape:(nsstring *)text

9. __bridge轉換不僅僅侷限於core foundation物件,某些api使用void *指標作為引數,允許你傳遞任何東西的引用,比如objective-c物件、core foundation物件或malloc()記憶體緩衝區等等。那麼傳引數的時候將這些物件轉換為void *,如:[uiview beginanimations:nil context:(__bridge void *)someobject],在使用這些引數的地方再將其轉換回來,如:myclass *myobject = (__bridge myclass *)context。

10. 記憶體管理權的移交有三種情況,a)使用cfbridgingrelease()或__bridge_transfer將管理僅移交給objective-c;b)使用cfbridgingretain()或__bridge_retained將管理權移交給core foundation;c)使用__bridge來臨時使用某物件,不改變管理權。

11. 在arc之前只有成員變數才會預設設為nil,在arc中區域性物件指標會被設為nil,區域性值型別和值型別指標還是隨機數。

12. 所有的core foundation物件型別都與objective-c能夠toll-free bridged,但是uicolor不能,因為uicolor與cgcolor並不是toll-free bridged,所以把cgcolor放入nsarray要強制轉換為id型別。

13. property中的屬性名不能以new開頭,除非將getter指定指定為另外乙個名字,@property nsstring *newtitle;會出錯,@property (getter=thenewtitle) nsstring *newtitle;正確。

14. autorelease pool變成了一種語言結構,而不是以前的類,@autoreleasepool{}比nsautoreleasepool快六倍。在乙個很大的迴圈中,有時候迴圈xx次進行一次nsautoreleasepool清除工作,但其實這是不必要的,每迴圈一次清一次也無所謂,現在@autoreleasepool指令比nsautoreleasepool快六倍,在迴圈中直接使用也不用擔心效能問題。

15. block會捕獲自己使用到的所有變數,如果用到成員變數,那麼成員變數所在的類會被retain,這樣這個類就不會被釋放,解決辦法是使用區域性變數,nsstring *text = self.artistname;,然後在block中使用text,而不是self.artistname,就不會出現問題。

16. 有時候block避免不了使用self物件,arc以前可以建立乙個區域性的__block物件,把self值賦值過去,如:__block myclass *blockself = self;,在block中引用這個__block區域性變數來訪問self的屬性都不會retain self,但是在arc中即使使用了__block來標記這個區域性變數,它也是強引用的,這時__block的唯一功能是允許你修改已捕獲的變數。arc的解決辦法是定義弱引用:__weak myclass *weakself = self;,這樣weakself引用了self,但不進行retain,在block中捕獲weakself而不是self,因此不存在所有權回環。在簡單應用中block屬於self,所以block不可能在self被釋放後還能被呼叫,有時候在block中檢查這個weakself被認為是不必要的,但是如果block被非同步呼叫,則建立強引用來保持物件存活就有必要了,因此在arc中使用block,而且要避免捕獲self,可以這樣:

1 - (void

)dosomething29

};10 }

17. 如果建立乙個物件,等待5秒後執行某一block,然後釋放掉該物件,在arc以前應該這樣:

1 - (void

)dosomething2;

8 [object launchafter:5

];9 }

在arc中不允許使用autorelease,所以去掉釋放那一行,那麼這樣會導致block永遠不會被執行,因為object物件在此函式返回後被釋放。解決辦法是定義__block型別變數,這種型別是強引用,且block中能修改其值,然後在block中將些變數設為nil,如下:

1 - (void

)dosomething2;

8 [object launchafter:5

];9 }

18. 

1 - (void

)dosomething27

//the string object is still alive here

8 }

19. 

1 - (void

)dosomething27

//the string object is still deallocated here

8 nslog(@"

%@", string); //

crash!

9 }

20. 編寫自己的out-parameter方法:

1 - (nsstring *)fetchkeyandvalue:(__autoreleasing nsnumber **)thevalue

2

21. core foundation物件不能autorelease,autorelease完全純屬於objective-c,有些人通過轉換core foundation物件為id,再呼叫autorelease,這在arc中明顯不能工作,因為不能呼叫autorelease。

ARC 學習筆記(一)

arc,顧名思義,automatic reference count,也就是自動引用計數。它是相對mrc 手動引用計數 而言的。當時不管是arc還是mrc,都應該嚴格遵守objective c記憶體管理的基本原則 strong修飾符 strong修飾符是預設的修飾符。這樣不管是alloc new c...

ios筆記 ARC筆記

arc知識介紹 1 概念 arc的全稱是 automatic reference counting 自動引用計數 是自ios5 之後增加的新特性,編譯器會自動在合適的地方插入適當的retain release autorelease 語句,會自動生成記憶體管理的 不用程式設計師手動編寫。2 如果是手...

原 iOS學習之ARC和非ARC檔案混編

在程式設計過程中,我們會用到很多各種各樣的他人封裝的第三方 但是有很多第三方都是在非arc情況下執行的,當你使用第三方編譯時出現和下圖類似的錯誤,就說明該第三方是非arc的,需要進行一些配置。解決方法 蘋果文件transitioning to arc release notes有一種解決辦法為 us...