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

时间:2010-08-24 03:34:27

标签: 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];
}

我不想使用此代码发送消息,并且需要在项目中多次重新生成,因为Web服务发生了变化,我需要更新代理类。

有什么想法吗?

提前致谢。

杰森

3 个答案:

答案 0 :(得分:12)

分析师抱怨,因为memory management guide指示......

  

使用名称以“alloc”或“new”开头或包含“copy”的方法“创建”对象。

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

答案 1 :(得分:5)

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

方法的“常规”命名约定,例如,为方法添加类的名称前缀,例如,如果为名为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

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

答案 2 :(得分:0)

如果您的方法名称必须包含“new”或“copy”之类的内容,并且您知道该警告无效 - 您可以通过在LLVM中包含一个提示,即该类是否正常来消除警告。

在你的头文件中,首先添加它(通常在顶部附近,但它可以在任何地方):

#ifndef __has_feature      // Optional.
#define __has_feature(x) 0 // Compatibility with non-clang compilers.
#endif

#ifndef NS_RETURNS_NOT_RETAINED
#if __has_feature(attribute_ns_returns_not_retained)
#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
#else
#define NS_RETURNS_NOT_RETAINED
#endif
#endif

然后在方法声明结束时添加如下:

+ (id) newWithNode: (CXMLNode*) node NS_RETURNS_NOT_RETAINED;

您可以在此处找到可以传递给LLVM的其他提示(真正的属性)列表:

http://clang-analyzer.llvm.org/annotations.html