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
後でオブジェクトを解放することをアナライザーに知らせるために、引数属性をいじろうとしましたが、うまくいかないようです。