我正在验证我的应用,我收到了很多这样的警告:
具有+0保留计数的对象返回给调用者,其中预期+1(拥有)保留计数
这是生成警告的其中一种方法的示例(警告在返回行上)
+ (vehicleInfo*) newWithNode: (CXMLNode*) node
{
if(node == nil) { return nil; }
return (vehicleInfo*)[[[vehicleInfo alloc] initWithNode: node] autorelease];
}
这是我应该担心的吗? 我该如何解决?
提前致谢, 塞缪尔
答案 0 :(得分:3)
您收到警告是因为您违反了您成为使用以new
命名的方法创建的对象的所有者的合同。任何调用+newWithNode
的代码都希望成为返回值的所有者,稍后应该调用-release
来释放它。
有关详细信息,请参阅Objective-C Memory Management Policy。
答案 1 :(得分:-1)
链接后,指南说:
使用autorelease发送延期发布
当您需要发送延迟发布消息时,通常在从方法返回对象时使用自动释放。例如,您可以像这样实现fullName方法:
- (NSString *)fullName {
NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@",
self.firstName, self.lastName] autorelease];
return string;
}
您拥有alloc返回的字符串。要遵守内存管理规则,您必须在丢失对该字符串的引用之前放弃该字符串的所有权。但是,如果使用release,则在返回之前将释放该字符串(并且该方法将返回无效对象)。使用自动释放,表示您要放弃所有权,但允许该方法的调用者在取消分配之前使用返回的字符串。
所以,尽管有警告,但我似乎正在做正确的事情,不是吗?