内存管理问题 - 释放必须返回的对象

时间:2010-06-05 17:39:44

标签: iphone

我有一个名为播放列表的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;
}

播放列表的数组分配步骤导致内存泄漏。在这种情况下我可以发布这个阵列吗?或者我可以通过做其他事情来避免在这里分配n初始化播放列表吗?任何帮助将不胜感激!!

2 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分: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