非ARC模式下內存管理總結

如果我們不使用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方法,同時還要避免使用創建自動釋放池對象的便利函數。

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