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

Jas*_*Bub 6 iphone memory-leaks

我有一组由www.sudzc.com创建的类(用于iPhone/Flex/Javascript的非常棒的WDSL Web服务代理创建工具).

当我运行CMD + SHIFT + A来检查内存泄漏时,我收到以下消息:

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

以下是返回该消息的方法:

// Static method for initializing from a node.
+ (id) newWithNode: (CXMLNode*) node
{
    return (id)[[[SoapObject alloc] initWithNode: node] autorelease];
}
Run Code Online (Sandbox Code Playgroud)

我不想用这个代码发送消息,它需要在项目中多次重新生成,因为Web服务发生了变化,我需要更新代理类.

有任何想法吗?

提前致谢.

贾森

Jer*_*nes 12

分析仪抱怨,因为内存管理指南要求......

您可以使用名称以"alloc"或"new"开头或包含"copy"的方法"创建"对象.

Cocoa和Objective-C在很大程度上依赖于约定,你应该尽一切努力遵循它.打开"将警告视为错误"并解决问题.虽然你现在可能是唯一一个从事此工作的人,但是如果其他开发人员在任何时候使用你的方法,他们很可能会遵循内存管理指南,并最终过度释放这个方法返回的对象(并且崩溃)该应用程序).


ima*_*boy 5

标记该方法,因为方法名称具有"新"前缀.静态分析器只是评论应用常规方法命名约定,人们会期望该方法返回您要释放的对象,而不是自动释放的对象.

方法的"常规"命名约定,例如为方法添加类的名称,例如,如果为名为Widget的类定义了该方法:

@interface Widget : NSObject {
}
+ (id)widgetWithNode:(CXMLNode*)node; // Returns an object that has been autoreleased.
- (id)initWithNode:(CXMLNode*)node; // Returns an object you are expected to release.
@end
Run Code Online (Sandbox Code Playgroud)

如果您正确使用该方法(也就是说,您正在考虑它返回一个自动释放的对象的事实),那么您可以忽略该警告.