2011-06-11 56 views
2

我有我的代碼段它調用返回一個NSMutableArray像這樣的方法:我如何釋放從類方法返回的數組?

+(NSMutableArray *)method { 

NSMutableArray *rgb = [[NSMutableArray alloc] initWithObjects:....., nil]; 

    return rgb; 

} 

它給我的每它被稱爲時間泄漏。在return後面輸入[rgb release];似乎不起作用。將它放在return之前會導致我的應用崩潰。同時放入autorelease會導致我的應用崩潰。建議?

回答

7
+(NSMutableArray *)method { 
    NSMutableArray *rgb = [[NSMutableArray alloc] initWithObjects:....., nil]; 
    return [rgb autorelease]; 
} 

或者:

+(NSMutableArray *)method { 
    NSMutableArray *rgb = [NSMutableArray arrayWithObjects:....., nil]; 
    return rgb; 
} 

如果仍然死機,那麼問題是最有可能的方法之外,沒有內。

+0

這兩個都會導致崩潰。不知道解決方案是什麼。它不會讓我在任何地方釋放陣列而不會造成問題。其他可能的解決方案?它不是那樣就是泄漏了物體,正如你所知道的那樣,它也不是一種選擇。 – Andrew 2011-06-12 00:18:50

+0

我認爲你泄漏的不是數組本身,而是其中的一些對象。 – Max 2011-06-12 00:41:23

+0

下面是完整的數組:NSMutableArray * rgb = [[NSMutableArray alloc] initWithObjects:[NSNumber numberWithInt:redInt],[NSNumber numberWithInt:greenInt],[NSNumber numberWithInt:blueInt],nil];' – Andrew 2011-06-12 00:44:48

4

但是這讓我每次都有漏洞 它被稱爲。放一個[rgb發佈];返回後似乎不起作用的 。 把它放回去之前使我的應用程序 崩潰。此外,放入一個autorelease 使我的應用程序崩潰。建議?

您需要閱讀Cocoa Memory Management Guidelines。這使得它很清楚地看出,這種方法必須自動釋放返回的對象:

+(NSMutableArray *)method { 
    NSMutableArray *rgb = [[NSMutableArray alloc] initWithObjects:....., nil]; 

    return [rgb autorelease]; 
} 

,或者:

+(NSMutableArray *)method { 
    NSMutableArray *rgb = [NSMutableArray arrayWithObjects:....., nil]; 

    return rgb; 
} 

的過度保留(比如在你的代碼)將不會導致崩潰(至少直到你用完內存)。如果發生崩潰,很可能是因爲您以其他方式管理內存不當。

嘗試使用構建和分析並修復它識別的所有問題。如果它仍然崩潰,如果你不知道爲什麼發佈崩潰的回溯。

+0

我嘗試了兩種方法,它給我一個不好的訪問崩潰,導致我到main.m. – Andrew 2011-06-12 00:29:20

+1

是的 - 毫不奇怪 - 你有其他地方的錯誤。我展示的兩個實現是正確的。您可能會在其他地方過度釋放該對象。 – bbum 2011-06-12 02:22:46