![](/img/trans.png)
[英]Incorrect decrement of the reference count of an object that is not owned at this point by the caller For retain property
[英]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的其他提示(实际属性)的列表:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.