我维护一个Objective-C项目,该项目使用实现垃圾收集脚本环境的C库。在某些情况下,我需要将保留的Objective-C对象放在脚本对象的私有字段中。然后,在finalize回调中释放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静态分析器不反对finalize回调中的随机释放,但是在初始设置该值的地方说“在第N行分配的对象可能泄漏”。
是否有注释或非丑陋模式会抑制此消息? (我宁愿不要做
[object performSelector:@selector(retain)]
之类的愚蠢的事情。我也更希望不要弄乱标有JS_SetPrivate
的标头。还要注意,赋予JS_SetPrivate
的值是一个任意指针,不一定是Objective -C对象。 最佳答案
您可以在JS_SetPrivate上使用新的NS_CONSUMED属性:
http://clang-analyzer.llvm.org/annotations.html#attr_ns_consumed