2011-04-27 46 views
1

我有一個類A的標題在界面中的NSDictionary *data;,而不是一個屬性。功能之間的內存問題

在一種方法中,我調用另一個返回NSDictionary的B類的另一種方法,我製作data = [class method],並且一切正常。

後來,當填充了data時,我嘗試從另一個A方法訪問data,並且應用程序崩潰。

如果我做在前面的方法上data一個保留:

data = [class method]; 
[data retain]; 

它所有的作品,但我現在有一個內存泄漏。爲什麼會崩潰?

回答

4

您在第一個案例中發生崩潰,因爲返回的字典在您引用它之前已經取消分配;和第二種情況下的內存泄漏,因爲您有-retain而沒有相應的-release

返回對象的大多數方法返回autorelease d對象。這可以確保該對象將持續到當前運行循環結束,但當時該對象將被釋放(這就是autorelease所做的)。所以,如果你想保持對象存活超過當前運行的循環,你必須把它保留下來:

data = [[class method] retain]; 

但是,一旦你保留一個對象,這是你的責任,將其釋放。對於一個對象實例變量,做這種事的時候,通常是在-dealloc

-(void) dealloc { 
    [data release]; 
} 

現在,你也應該知道,如果你覆蓋data與另一個值,你還必須確保舊值得到正確釋放。這是使用屬性的好處之一:你可以讓編譯器爲你編寫一些處理這個問題的函數。如果你的財產是財產retain,比

self.data = newvalue; 

會)release舊值,B)retain新值設定值,以及c)你的實例變量設置爲新值。儘管如此,當你的對象被銷燬時,你仍然必須在dealloc中自己釋放這個值。

+2

不要忘記'[super dealloc];',只是爲了在政治上是正確的。 :) – 2011-04-27 17:23:14

+0

確實,'[super dealloc]'總是一個好主意。 – 2011-04-27 17:49:37

0

爲什麼它是內存泄漏?如果我理解你的問題,你只需要在你的dealloc的A類方法中做[data release];