[英]Memory management in objective-c
我在我的一个课程中有这个代码:
- (void) processArray
{
NSMutableArray* array = [self getArray];
. . .
[array release];
array = nil;
}
- (NSMutableArray*) getArray
{
//NO 1:
NSMutableArray* array = [[NSMutableArray alloc]init];
//NO 2:
NSMutableArray* array = [NSMutableArray array];
. . .
return array;
}
NO 1:我创建一个数组并将其返回。 在processArray
方法中我释放它。
NO 2:我通过简单地调用array
得到一个array
。 因为我不是这个的拥有者,所以我不需要在processArray
方法中释放它。
哪个是最佳选择,NO 1还是NO 2? 或者有更好的解决方案吗?
该方法应该返回一个自动释放的数组,NO 2是更好的选择。 原因是当你用方法调用方法时
NSMutableArray* array = [self getArray];
作为惯例,你会期望不必释放数组。 如果你想拥有它,你保留它,但否则你不应该关心它。 在Cocoa中,您只能通过显式发送alloc
或retain
或copy
(或new
)来获取所有权。 由于processArray
方法不这样做,因此不必处理释放数组的问题。
所以你应该使用NO 2,你也应该删除这两行:
[array release];
array = nil;
如果数组及其内容使用了大量内存或其使用了很多次,您将需要立即释放它们,因此请使用选项1.根据Objective-C指南,您需要在单词“前缀”前加上在这种情况下,新的“到您的子程序名称而不是”获取“。
另一方面,如果你想减少简单地说[array release]的代码行数; 或类似然后使用选项2。
它只是减少代码行和减少不必要的临时内存使用之间的平衡。
虽然自动释放池将有助于减少内存泄漏并使代码更小,但有时您需要明确释放所有内容,因为它不再使用以保持内存的使用。
HTH
编辑
啊 - 我的立场得到了纠正。 阅读适用于Cocoa的内存管理编程指南的iPhone版本我看到iPhone指南使用的是“new ...”的前缀,例如“newArray”在这种情况下,如果调用者应该手动释放而不是前缀“创建...”。 “创建”可以指创建手动释放或自动释放的对象,因此可能不明确。 上面纠正了文字。
- (void) processArray
{
NSMutableArray* array = [[self getArray] retain];
//Now you are the owner of array, so you take care to release it
. . .
[array release];
array = nil;
}
- (NSMutableArray*) getArray
{
//create a new array
//temporarily the method owns the array
NSMutableArray* array = [[NSMutableArray alloc]init];
//fill in here with elements or what you want
..........
[array autorelease];
//autorelease here says "I don't own the result
//if anyone cares about it, he should retain it himself
return array;
}
因此,在创建新对象时,您应该在返回之前自动释放它们。 因为如果调用方法想要使用结果,则调用方法应该保留并释放结果。
当你在保留/发布代码中不确定时,为这个问题运行Klang静态分析器总是好的: http : //clang-analyzer.llvm.org/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.