我维护一个Objective-C项目,该项目使用一个C库来实现垃圾收集脚本环境。在某些情况下,我需要将一个保留的Objective-C对象放在脚本对象的私有字段中。然后在终结回调中释放Objective-C对象。
设置私有值的调用看起来像这样,希望有明显的语义:
if (!JS_SetPrivate(context, jsSelf, [self retain])) /* handle error */
finalize回调执行此操作:
id object = JS_GetPrivate(context, jsSelf);
if (object != nil)
{
[object clearJSSelf:jsSelf]; // Remove reference to JS wrapper.
[object release]; // JS wrapper owned a reference.
JS_SetPrivate(context, jsSelf, nil);
}
Clang Static Analyzer对finalize回调中的随机释放没有异议,但是最初设置的值是“在N行分配的对象的潜在泄漏。”
是否存在可以抑制此消息的注释或非丑陋模式? (我宁愿不做像[object performSelector:@selector(retain)]
这样的愚蠢的事情。我也不想弄乱JS_SetPrivate
声明的标题。另请注意,给JS_SetPrivate
的值是任意的指针,不一定是Objective-C对象。
答案 0 :(得分:2)
您可以在JS_SetPrivate上使用新的NS_CONSUMED属性:
http://clang-analyzer.llvm.org/annotations.html#attr_ns_consumed