当我需要从方法返回时,我对如何处理NSMutableArray的释放非常困惑。我甚至不确定我是否想要释放它。
我有代码:
-(NSArray *)methodToCall {
NSMutableArray *mutArray = [[NSMutableArray alloc] initWithCapacity:10];
//Fill the array with stuff here
[mutArray release]; //Am I suppose to have this to keep the memory down?
return mutArray;
}
我的问题是我是否假设代码中有[mutArray release];
。有人可以解释一下吗?我很茫然,我希望尽可能保持我的代码干净无泄漏。
答案 0 :(得分:9)
您的方法的调用者将期望有效的NSArray,但它不拥有。
如果你release
就像你在问题中所做的那样,那么你将返回一个无效的对象(因为你已经分配并释放了它。)所以这不是你想要的。
你应该在返回之前“自动释放”数组。然后你将分配它,但在返回之前放弃所有权(不强行释放它)。当自动释放池被清理时,它将在当前事件循环结束时有效,并且您的调用者可以保留它或者让它适当地运行:
-(NSArray *)methodToCall {
NSMutableArray *mutArray = [[NSMutableArray alloc] initWithCapacity:10];
//Fill the array with stuff here
return [mutArray autorelease];
}
您的另一种选择,因为您不需要保留参考,或者首先使用“自动释放”便捷方法之一来创建它:
-(NSArray *)methodToCall {
// We're not doing an explicit alloc/init here, so...
NSMutableArray *mutArray = [NSMutableArray arrayWithCapacity:10];
// ...no autorelease necessary.
return mutArray;
}
答案 1 :(得分:4)
简短回答 - 否。
就像现在一样,你正在分配一个数组,然后在返回之前释放(释放)它。因此,当您尝试从调用方法访问返回对象时,您将会崩溃。
我的建议是使用autorelease
或者让调用方法或类ivar负责这个数组对象(如果经常使用它)。
autorelease
的一个例子:
NSMutableArray *mutArray = [[[NSMutableArray alloc] initWithCapacity:10] autorelease];
我还建议您阅读开发者文档中的Memory Management。
答案 2 :(得分:1)
通常,不要使用alloc / init来创建临时数组,而应考虑使用便利创建方法(在这种情况下为+arrayWithCapacity:
):
- (NSArray *)methodToCall
{
NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:10];
// Fill the array with stuff here
return mutableArray;
}
+arrayWithCapacity:
等便捷创建方法返回调用者不负责的对象,从而减轻了调用内存管理负担的代码。由于调用代码只是返回引用而不是存储它,这将简化事情。
答案 3 :(得分:1)
如果你通过调用alloc和init来进行显式对象分配,那么你就是对象的所有者,所以你负责它的对象保留值,否则你通过隐式做到这一点你不需要关心它。它将照顾好自己。
-(NSMutableArray *)getArray
{
NSMutableArray *array=[[NSMutableArray alloc] initWithCapacity:10];
//your code
return [array autorelease];
}
在上面的代码中我们是对象的所有者,所以我们需要通过autorelease来处理它的保留计数,autoreleasepool会处理它。
-(NSMutableArray *)getArray
{
NSMutableArray *array=[NSMutableArray allocWithCapacity:10];
//your code
return array;
}
在上面的代码中我们没有分配任何对象,我们只是调用类方法来定义数组的大小。
如果您想了解更多详细信息,请访问Apple库中的object ownership in Memory management guide