Я поддерживаю проект Objective-C, который использует библиотеку C, которая реализует среду сценариев для сбора мусора.В некоторых случаях мне нужно поместить сохраненный объект Objective-C в приватное поле объекта сценария.Затем объект Objective C освобождается в обратном вызове finalize.
Вызов для установки частного значения выглядит следующим образом с, как мы надеемся, очевидной семантикой:
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
, является произвольным указателем, а не обязательно целью-C объект.