具有+0保留计数的对象返回给调用者,其中预期+1(拥有)保留计数

时间:2012-04-10 22:19:04

标签: retain

我正在验证我的应用,我收到了很多这样的警告:

具有+0保留计数的对象返回给调用者,其中预期+1(拥有)保留计数

这是生成警告的其中一种方法的示例(警告在返回行上)

+ (vehicleInfo*) newWithNode: (CXMLNode*) node
{
    if(node == nil) { return nil; }
    return (vehicleInfo*)[[[vehicleInfo alloc] initWithNode: node] autorelease];
}

这是我应该担心的吗? 我该如何解决?

提前致谢, 塞缪尔

2 个答案:

答案 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,则在返回之前将释放该字符串(并且该方法将返回无效对象)。使用自动释放,表示您要放弃所有权,但允许该方法的调用者在取消分配之前使用返回的字符串。

所以,尽管有警告,但我似乎正在做正确的事情,不是吗?