iPhone:在仍然释放时返回方法中的NSMutableArray

时间:2010-09-30 23:15:53

标签: iphone arrays nsstring nsmutablearray

我想了解更多关于内存管理的内容。知道我需要释放任何我初始化或分配的东西,我对以下内容感到困惑:

- (NSMutableArray *)getData {
    NSMutableArray *data = [[NSMutableArray alloc] init];
    NSString *first = @"First object";
    [data addObject:first];
    NSString *second = @"Second object";
    [data addObject:second];

    return data;

}

因为我使用了alloc和init,所以我知道我需要释放我的数据对象。但是如果我将自动释放添加到init部分或返回,则在运行该方法时它会崩溃。

通过正确的iPhone内存管理,这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:3)

你应该自动释放,就像你说的那样。调用者可能需要像这样保留 - 特别是如果存储到实例变量中:

NSMutableArray *array = [[obj getData] retain];

后来,当它完全用它完成时:

[array release]; // balances the retain above

答案 1 :(得分:2)

你走在正确的轨道上。您应该将每个alloc / initreleaseautorelease配对,这样一旦对象的最终引用消失,该对象就会被清除。< / p>

模式是这样的:

- (SomeObject*)generateSomeObject
{
    SomeObject* someObject = [[[SomeObject alloc] init] autorelease];
    ...
    return someObject;
}

答案 2 :(得分:0)

您是否将此方法的结果分配给实例变量?请记住,添加到自动释放池的内容将在未来的某个时间点释放(通常在运行循环结束时),因此如果将其分配给实例变量,并且运行循环结束,除非你保留,否则你的实例变量最终将指向垃圾(或有时是不同的对象)。

方法的名称(getData)表明要返回的对象应该是自动释放的,因此您可以使用[NSMutableArray array]创建数组,按照惯例填充它,然后返回它从方法。

如果调用getData的代码希望数组在运行循环的迭代中存活,则需要retain它,但是,它还需要确保release最后完成它的数组 - 这通常在你的dealloc方法中完成。