我有一组由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服务发生了变化,我需要更新代理类。
有什么想法吗?
提前致谢。
杰森
答案 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的其他提示(真正的属性)列表: