非ARC模式下記憶體管理總結

2021-07-10 05:53:36 字數 916 閱讀 7529

如果我們不使用arc來自動管理記憶體,那麼則應該記住以下準則:

1.對於臨時物件:

a.通過alloc/new/copy獲得的物件,應該在不再使用時釋放該物件(release);

b.通過其他任何方法獲得的物件,我們假設該物件的retaincount為1,且被設定為自動釋放物件,因此我們不需要做任何事情;

2.對於你打算長期擁有的物件,例如你希望其他的例項物件可以訪問這個物件:

a.通過alloc/new/copy獲得的物件,應該在dealloc方法中釋放該物件;

b.通過其他任何方法獲得的物件,因為我們假設該物件的retaincount為1,且被設定為自動釋放物件,現在你希望長期擁有這個物件,因此我們需要保留他(retain),同時在不再使用他的時候,在dealloc方法中釋放這個物件,我們應該保證retain和release方法的使用次數是相等的;

另外,不管乙個物件的retaincount是多少,比如乙個nsstring物件str的retaincount為2,如果執行str = nil;   那麼str的retaincount都會被置為0,具體原因在這裡。

因此,判斷乙個物件應該如何實現記憶體管理時,我們可以先看這個物件是怎麼得到的,然後考慮我們是臨時使用它還是想長期保留它,依次做出決策。

另外,自動釋放池nsautoreleasepool是以棧的形式實現的,因此當你建立乙個自動釋放池並加入乙個希望自動釋放的物件以後,再新建乙個自動釋放池,隨後release這個自動釋放池,之前建立的物件並不會被釋放,因為存放他的那個自動釋放池還是存在的。

實際上,在編寫iphone程式時,蘋果公司建議你不要在自己的**中使用autorelease方法,同時還要避免使用建立自動釋放池物件的便利函式。

ARC下的記憶體管理

本文討論一下arc automatic referencing count 下的記憶體管理問題 例項變數是類的私有成員變數,無法被外部訪問,並且子類無法繼承。屬性以 property修飾,是封裝了getter setter方法的 成員變數 可以被外部訪問和被繼承。宣告屬性後,系統會生成乙個名為 pr...

ARC下記憶體洩露總結

a有個屬性b,b有個屬性a,如果都是strong修飾的話,兩個物件都無法釋放。這種問題常發生於把delegate宣告為strong屬性了。例,inte ce sampleviewcontroller property nonatomic,strong sampleclass sampleclass ...

iOS非ARC記憶體管理摘要 實踐型

關於ios記憶體管理。在開發過程中,記憶體管理很重要,我簡單說明一下。1.正確用法 uiview v uiview alloc init 分配後引用計數為1 self.view addsubview v 這兒引用計數加1,為2 v release 這兒引用計數為1 最後系統在 self.view的時...