繁体   English   中英

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

[英]Object with +0 retain counts returned to caller where a +1 (owning) retaincount is expected

我有一组由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服务发生了变化,我需要更新代理类。

有任何想法吗?

提前致谢。

贾森

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

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

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

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

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

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

如果您的方法名称必须包含“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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM