IOS內存管理

   在ios5之前,是沒有ARC的,所以內存靠自己手動回收或者使用autorelease.下面來介紹非ARC的情況,假定有兩個指針a和b.

   1.關鍵字asign。針對的情況就是直接賦值,只針對基本類型,比如int float double short bool char long等。它只進行直接賦值,不進行引用計數,所以也不用管理內存。

    2.關鍵字retain。假定指針a指向了一塊內存區域,我們又將b指向了這塊內存,這時候我們假定指針a不再使用,我們是否可以釋放掉這塊內存?答案是很明顯的。不能!因爲b還 在使用這塊內存,如果釋放,就會crash掉。所以引入了引用計數功能。retain就是計數+1,當我們對屬性設定了retain關鍵字時,alloc init就會對內存計數+1

     3.關鍵字release.release和第二條剛好相反,進行引用技術-1操作。當引用技術爲0時,dealloc會被調用,內存被回收。如果指針a指向了兩塊內存,那麼就應該調用兩次release。

     4.關鍵字copy。copy的意思就是複製了兩塊內存。

     5.關鍵字atomic。此屬性只支持同步操作,也就是線程安全的。

     6.關鍵字nonatomic。支持異步操作,非線程安全。

     7.關鍵字autorelease。如果a指向的對象是autorelease的,那麼我們將不用對a進行release操作。當a不再使用時,a將進入NSAutoReleasePool. a的生命週期將會被延長,當pool drain的時候,a纔會被銷燬。應用啓動的時候會初始化一個NSAutoReleasePool.在main函數裏。

    8.NSAutoReleasePool介紹。

    

    初始化的方法爲:NSAutoreleasePool *subPool = [[NSAutoreleasePool alloc] init];

    釋放的方法非release而是[subPool drain];

    以下英文摘自蘋果官方文檔。

In a garbage collected environment, release is a no-op. NSAutoreleasePool therefore provides a drain method that in a reference-counted environment behaves the same as calling release, but which in a garbage collected environment triggers garbage collection (if the memory allocated since the last collection is greater than the current threshold). Typically, therefore, you should use drain rather than release to dispose of an autorelease pool.


    使用場景:1.當我們使用autorelease管理的內存過大時,應自己初始化一個pool並執行回收,因爲pool管理的內存回收的時間是不確定的。 2.當我們新起一個線程的時候,如果我們用到了autorelease,我們應當自己初始化一個pool,因爲主線程是不管理新起線程的autorelease的。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章