2010-06-05 50 views
1

我有一個名爲播放列表的NSMutableArray。這是一個名爲getAllPlaylists的方法。代碼是這樣的:內存管理問題 - 釋放一個必須返回的對象

-(NSMutableArray *)getAllPlaylists 
{ 
    //playlist is an instance variable 
    playlist = [[NSMutableArray alloc] init]; //memory leak here 
    ... 
    //some code here which populates the playlist array 
    [playlist addObject: object1]; 
    ... 
    return playlist; 
} 

播放列表的數組分配步驟導致內存泄漏。在這種情況下,我可以釋放這個數組嗎?或者我可以通過做別的事情來避免在這裏分配播放列表的初始化?任何幫助將不勝感激!!

回答

1

2解決方案:

使用autorelease

- (NSMutableArray*)getAllPlaylists 
{ 
    playlist = [[NSMutableArray alloc] init]; 
    ... 
    return [playlist autorelease]; 
} 

或代替使用[[NSMutableArray alloc] init]創建您的NSMutableArray對象,使用[NSMutableArray array]這相當於[[[NSMutableArray alloc] init] autorelease]

- (NSMutableArray*)getAllPlaylists 
{ 
    playlist = [NSMutableArray array]; 
    ... 
    return playlist; 
} 
+0

謝謝!但上次我嘗試播放列表= [NSMutableArray數組];該應用程序崩潰。無論如何,我會再試一次。 – ulag 2010-06-05 17:54:17

+0

只要您不嘗試在班級中使用其他任何方法中的「播放列表」,此功能就會起作用。在這種情況下,根本不需要有實例變量(取決於你想要做什麼)。 – wbyoung 2010-06-05 18:05:47

+0

如果你使用'playlist = [NSMutableArray array];'確保你不要試圖在任何地方釋放它。這可能會導致崩潰。 – indragie 2010-06-06 02:46:56

1

您應該自動釋放您想要返回但不屬於對象(本地變量,不是實例變量)的新創建的對象。

playlist = [[[NSMutableArray alloc] init] autorelease]; 

或者,你可以使用的便利方法,這樣做更容易:

playlist = [NSMutableArray array]; 

對於對象擁有的項目(實例變量),你應該確保你首先釋放舊的價值和實現一個dealloc方法也釋放值。

- (NSMutableArray*)getAllPlaylists { 
    [playlist release]; 
    playlist = [[NSMutableArray alloc] init]; 
    return playlist; 
} 

- (void)dealloc { 
    [playlist release]; 
    [super dealloc]; 
} 

欲瞭解更多信息,請參閱memory management guide

+0

謝謝!但是,第一次調用getAllPlaylists時,播放列表數組不會釋放任何內存分配。不會導致錯誤? – ulag 2010-06-05 17:55:44

+0

第一次調用'getAllPlaylists'時,'playlist'將是'nil'。將消息發送到'nil' [允許](http://developer.apple.com/mac/library/documentation/cocoa/conceptual/objectivec/Articles/ocObjectsClasses.html#//apple_ref/doc/uid/TP30001163- CH11-SW7)在Objective-C中。 – wbyoung 2010-06-05 18:03:58

+0

謝謝,我會試試這個。 – ulag 2010-06-05 18:04:48