自动释放NSMutableArray的问题

时间:2011-06-16 17:39:55

标签: objective-c ios

我无法释放我在方法中创建的NSMutableArray。

SqliteData *s = [SqliteData alloc];

items = [NSArray alloc];
items = [s getItems:parent];
[s release];

IN SQLITeDATA类

-(NSMutableArray *)getItems:(NSString *)parent
{
    NSMutableArray *items = [[[NSMutableArray alloc] init]autorelease];
    return items
}

应用程序崩溃,如果我删除自动释放,它可以正常工作。

2 个答案:

答案 0 :(得分:3)

正确的版本是:

SqliteData *s = [[SqliteData alloc] init];
items = [[s getItems:parent] retain];
[s release];

这与:

类似,但不太优化
SqliteData *s = [[[SqliteData alloc] init] autorelease];
items = [[s getItems:parent] retain];

注意内存泄漏:

SqliteData *s = [SqliteData alloc];
items = [NSArray alloc]; // memory leak there!
items = [s getItems:parent];
[s release];

您正在泄漏内存,因为您将新分配的items地址替换为另一个地址。

没有alloc的{​​{1}}是无意义的。 (你正在分配内存,但没有初始化它!)

答案 1 :(得分:2)

  • 您在下一行使用不同的值覆盖第一个items。您首先不需要alloc - 它什么都不做。

  • 在没有alloc的情况下使用init无效。使用[[foo alloc] init][foo new]

  • 自动释放的对象只是暂时的(直到当前池的生命周期结束,这通常是线程或回调的生命 - 不要指望对象将比它所处的函数的持续时间更长久存活)。您需要retain他们。