在以下功能中哪一个是最佳实践?
要发送自动释放的对象,并让调用者保留它?
或发送已分配的对象,并让调用者释放它?
- (NSString*) convertDataToString :(NSData*)myData { //just an example, method might not exist NSString *str = [[NSString alloc] initWithData:myData]; return str; return [str autoRelease]; }
答案 0 :(得分:7)
跟进@ Chuck的评论,-convertDataToString
不得返回调用者必须释放的对象。这会违反Three Magic Words。如果您的名称中没有“copy”,“alloc”或“new”,则不能指望调用者释放该对象。如果您的名字中有“copy”或以“new”或“alloc”开头,则调用者必须释放该对象。
Objective-C在很大程度上依赖于一致的命名,而名称意味着什么。如果你学习了命名,那么你就不会有任何问题。
答案 1 :(得分:3)
memory management rules说你的第一个例子是 - 这是直接引用 - 错了。这甚至不是偏好问题,因为这里的一些答案似乎表明了这一点。调用者通常不拥有您返回的对象,因此应该自动释放。
规则中的具体例子说明了这一点:
这是错误的。遵循所有权政策,会导致内存泄漏。
– (NSArray *)sprockets {
NSArray *array = [[NSArray alloc] initWithObjects:mainSprocket,
auxiliarySprocket, nil];
return array;
}
对象对新数组对象的引用仅限于sprockets方法。方法返回后,对象将失去对新对象的引用,因此无法放弃所有权。这本身不是问题。但是,遵循前面提到的命名约定,调用者不会指示它拥有返回的对象。因此,调用者不会放弃返回对象的所有权,从而导致内存泄漏。
答案 2 :(得分:2)
您希望在大多数情况下返回自动释放的对象。 除非您的方法名称包含以下单词之一[ alloc , new , copy ],否则您应该返回一个自动释放的对象。
答案 3 :(得分:1)
如果您创建,分配或复制对象,则您有责任释放它。基于此,您应该返回一个自动释放的对象。
答案 4 :(得分:0)
我更愿意退回自动释放。这意味着你不是在寻找内存被释放的地方。保持内存分配和解除分配可以让您的生活更轻松。毕竟,你正在为此编码,为什么要让自己变得更难。
答案 5 :(得分:0)
两者都可以接受,但是你应该相应地命名你的方法:如果调用者有责任解除分配它,你必须通过让你的方法名包含“create”,“alloc”或“copy”来明确这个,否则它不应该。 有关详情,请参阅http://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html%23//apple_ref/doc/uid/20000994-BAJHFBGH
返回自动释放对象可能有点习惯,但两者都没问题。