在class_createInstance返回的对象上调用autorelease时分析错误

时间:2011-07-20 23:31:06

标签: objective-c ios

我正在将合作伙伴提供的代码添加到我的iOS项目中,该项目调用class_createInstance,然后在返回之前调用autorelease,如下所示:

Class functionClass = objc_getClass(functionName);
NSObject* functionObject = class_createInstance(functionClass, 0);
[[functionObject performSelector:@selector(initWithDictionary:) withObject:msg] autorelease];

在Xcode 4.0.2中运行Analyze时,我在最后一行收到以下警告:

Object sent -autorelease too many times

问题1: 该对象如何被多次发送自动发布?
我对class_createInstance的理解是我需要释放它返回的值。

问题2: 如果代码正确,我该如何避免分析警告?
我们有一个非常严格的政策,不要检查任何分析警告。

1 个答案:

答案 0 :(得分:1)

这是一个非常奇怪的模式,因此,分析仪根本不知道它。 class_createInstance()的使用极为罕见。

两个可能的解决方案:

  1. 使用预处理器标记告诉分析器,是的,实际上,functionObject是一个保留的引用(我没有标记方便 - 你会在发行说明或llvm中找到它.org网站或搜索系统标题)。

  2. 请勿使用class_createInstance()。一旦您有了对该类的引用,只需使用+alloc。更好的是,将整个表达式重写为[[objc_getClass(functionName) alloc] initWithDictionary:msg]并完成它。

  3. 您还应该通过http://bugreporter.apple.com提交错误,因为虽然很奇怪,但静态分析器不应该对此进行限制。