我想了解更多关于内存管理的内容。知道我需要释放任何我初始化或分配的东西,我对以下内容感到困惑:
- (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内存管理,这样做的正确方法是什么?
答案 0 :(得分:3)
你应该自动释放,就像你说的那样。调用者可能需要像这样保留 - 特别是如果存储到实例变量中:
NSMutableArray *array = [[obj getData] retain];
后来,当它完全用它完成时:
[array release]; // balances the retain above
答案 1 :(得分:2)
你走在正确的轨道上。您应该将每个alloc
/ init
与release
或autorelease
配对,这样一旦对象的最终引用消失,该对象就会被清除。< / p>
模式是这样的:
- (SomeObject*)generateSomeObject
{
SomeObject* someObject = [[[SomeObject alloc] init] autorelease];
...
return someObject;
}
答案 2 :(得分:0)
您是否将此方法的结果分配给实例变量?请记住,添加到自动释放池的内容将在未来的某个时间点释放(通常在运行循环结束时),因此如果将其分配给实例变量,并且运行循环结束,除非你保留,否则你的实例变量最终将指向垃圾(或有时是不同的对象)。
方法的名称(getData
)表明要返回的对象应该是自动释放的,因此您可以使用[NSMutableArray array]
创建数组,按照惯例填充它,然后返回它从方法。
如果调用getData
的代码希望数组在运行循环的迭代中存活,则需要retain
它,但是,它还需要确保release
最后完成它的数组 - 这通常在你的dealloc
方法中完成。