Я обертываю определенный C API в Objective-C. У меня есть удобный метод, который берет некоторые CFTypeRef
из процедурного API и возвращает объект обтекания из OOP API. Этот объект сохраняет переданный CFTypeRef
и освобождает его по своему собственному освобождению. Удобный метод выглядит так:
+ (id) wrapFoo: (CFTypeRef) foo;
У меня есть много методов, которые просто получают CFTypeRef
и возвращают объект обтекания:
- (id) doSomething {
CFTypeRef foo = CFCreateSomeObject();
id wrapper = [WrappingClass wrapFoo:foo];
CFRelease(foo);
return wrapper;
}
Это немного неуклюже, так что я предложил другой удобный метод:
+ (id) wrapNonRetainedFoo: (CFTypeRef) foo {
id wrapper = [self wrapFoo:foo]; // CFRetains foo
CFRelease(foo);
return wrapper;
}
Теперь я могу переписать метод doSomething
следующим образом:
- (id) doSomething {
return [WrappingClass wrapNonRetainedFoo:CFCreateSomeObject()]; // XXX
}
Мне это нравится. Я не очень горжусь методом wrapNonRetainedFoo
, но он не является частью общедоступного интерфейса пакета и экономит мне несколько строк стандартного кода в нескольких методах.
Недостатком является то, что статический анализатор помечает линию XXX
как потенциальную утечку. Что я могу сделать лучше? Я попытался поиграть с атрибутом аргумента cf_consumed
, чтобы дать анализатору понять, что я освобождаю объект позже, но, похоже, он не работает.