1

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

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

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

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

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

在此先感谢,塞缪尔

4

2 回答 2

3

您收到警告是因为您违反了成为使用名为 with 的方法创建的对象的所有者的合同new。任何代码调用+newWithNode都期望成为返回值的所有者,并且应该稍后调用-release以释放它。

有关详细信息,请参阅Objective-C 内存管理策略

于 2012-04-10T22:24:59.527 回答
-1

在链接之后,指南说:

使用 autorelease 发送延迟版本

当您需要发送延迟释放消息时(通常是从方法返回对象时)使用自动释放。例如,您可以像这样实现 fullName 方法:

- (NSString *)fullName {
     NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@",
                                      self.firstName, self.lastName] autorelease];
     return string;
}

你拥有 alloc 返回的字符串。要遵守内存管理规则,您必须在丢失对它的引用之前放弃对字符串的所有权。但是,如果您使用 release,则字符串将在返回之前被释放(并且该方法将返回无效对象)。使用自动释放,您表示您想要放弃所有权,但您允许方法的调用者在释放之前使用返回的字符串。

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

于 2012-04-12T21:29:06.510 回答