2013-12-11 69 views
0

泄漏儀器警告我有關的這部分代碼中的內存泄漏:Objective-C的內存泄漏的addSubview

[self.contview addSubview:nav.view]; 

下面是我如何管理的觀點:

[nav.view removeFromSuperview]; 
    self.nav = [[[destinationClass alloc] initWithNibName:pagename bundle:nil] autorelease]; 
    [self.contview addSubview:nav.view]; 

是它正常情況下,self.nav的retainCount爲2後剛分配?這可能與內存泄漏有關嗎?

我很新的內存管理有人可以給我一些幫助嗎?

非常感謝

+0

你能發佈所有相關的碼?這對我來說看起來有點奇怪,但沒有上下文就很難說清楚。 –

+0

是否使用ARC? –

+3

www.whentouseretaincount.com - 「retainCount」無關緊要。使用分配工具查看每個保留/釋放事件的堆棧跟蹤。 – bbum

回答

2

假設nav是強(保留)屬性,它保留了視圖控制器要指定的位置:有效

self.nav = [[[destinationClass alloc] initWithNibName:pagename bundle:nil] autorelease]; 

,這行代碼後保留計數是1; +2代表allocretain和-1代表autorelease。通常你不應該使用retainCount方法來確定對象的實際保留數,也許this answer會給你更多的理解爲什麼。 每個alloc,retaincopy呼叫應與releaseautorelease呼叫相匹配。你應該在你的類dealloc方法添加匹配釋放呼叫

-(void) dealloc { 
    [_nav release]; 
    _nav = nil; 
    [super dealloc]; 
} 

不要使用手動內存管理,使用ARC,它會讓你的生活變得更輕鬆:)

+1

當然,RC的值2實際上並不反映「自動釋放」,因此它實際上是1.但是巧合的是它可能是42並且仍然有效。絕對保留數是沒有意義的。實際上,對於alloc來說,它是+1,'self.nav ='和-1爲自動釋放,在執行該行代碼後產生+1(因此,需要在其他位置創建-1)此代碼正確)。請注意,您應該使用'[_nav release];'或'self.nav = nil;'來防止懸掛指針。 – bbum

+0

你是對的,保留計數在alloc,retain和autorelease後是有效的1,現在我再次閱讀我的答案,我明白你想指出的是什麼。我會做一些改寫:) –

+0

'dealloc'會崩潰;只需使用'[_nav release]; _nav = nil;'或'self.nav = nil;',但不要混淆兩者。 *通常*模式是直接在'dealloc'中釋放實例變量,並直接在'init'中賦值。 (好編輯,順便說一句,謝謝) – bbum