我在 Objective-C 中包装了某个 C API。我有一个方便的方法,它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
参数属性,让分析器知道我稍后会释放该对象,但它似乎不起作用。