手動保持リリース コードを ARC に変換しようとしています。
リターン ポインターの値が CFTypeRef に格納されている Objective-C の便利なコンストラクターがある場合、フリー ブリッジを使用する正しい方法を見つけるのに苦労しています。
MRR を使用した既存のコード:
@interface SourceItemCell UITableViewCell
{
CATextLayer *mSourceText;
}
@implementation SourceItemCell
- (id)init
{
self = [super init];
mSourceText = [CATextLayer layer];
// key line I'm wondering about:
mSourceText.font = [UIFont fontWithName:@"HelveticaNeue" size:12.0];
[[self contentView].layer addSublayer:mSourceText];
return self;
}
ドキュメントを調べなくても済むように、CATextLayer のフォント プロパティは CFTypeRef 型になっています。
私のオプションは次のようです:
mSourceText.font = (__bridge CFTypeRef)[UIFont fontWithName:@"HelveticaNeue" size:12.0];
また:
mSourceText.font = (__bridge_transfer CFTypeRef)[UIFont fontWithName:@"HelveticaNeue" size:12.0];
また:
mSourceText.font = (__bridge_retained CFTypeRef)[UIFont fontWithName:@"HelveticaNeue" size:12.0];
これが私の考えです。私が見つけたフリーダイヤル ブリッジングの最も明確なガイドはhttp://www.mikeash.com/pyblog/friday-qa-2011-09-30-automatic-reference-counting.htmlです。Objective-C 型から C 型へのキャストの同様の例があり、それについて彼は次のように書いています。
__bridge_retained を使用することで、所有権をシステムから私たちの手に移すように ARC に指示できます。所有権が譲渡されたので、他の CF コードと同様に、オブジェクトの処理が完了したらオブジェクトを解放する必要があります。
...そうでなければ、__bridge だけを使用すると、ARC は CFTypeRef のアカウントのメモリを保持しようとはしません。
そこで、私が考える最も賢明な方法は次のとおりです。
mSourceText.font = (__bridge_retained CFTypeRef)[UIFont fontWithName:@"HelveticaNeue" size:12.0];
... // At some later point
CFRelease(mSourceText.font);
もしそれが正しければ、リリースしても安全だと確信できる時期についてはまだかなりはっきりしていません。
結論として、私の実際の質問は次のとおりです。
- 提案されたコードは正しいですか?
- このオブジェクトはどこで CFRelease する必要がありますか? SourceItemCell の dealloc 関数では?
関連する質問が私の質問に答えたとは思わなかった理由は次のとおりです。
- 自動解放されたオブジェクトを Core Foundation にブリッジする場合、__bridge または __bridge_retained を使用する必要がありますか? Objective-C の便利なコンストラクタが前の行の Objective-C 変数に明示的に保存されていることが重要かどうかはわかりません。また、承認された回答では、Cオブジェクトの「ライフサイクルを管理したい場合」にのみ__bridge_retainedを使用するように言われていますが、これは間違っていると思います...ライフサイクルを自分で管理する必要があるため、多くの人が__bridge_retainedを使用しているように感じます.
- どこで、どのように __bridge承認された回答には役立つ要約がありますが、保持されていない例に焦点を当てています。
PS。私は Helvetica を使用しているので、私を判断しないでください... :)
編集:
__bridge_retained を使用して静的アナライザーを実行すると、次のような苦情が寄せられます。
「プロパティは、保持カウントが +0 の Core Foundation オブジェクトを返します。この時点で呼び出し元が所有していないオブジェクトの参照カウントが正しく減少しません。」
(mDelegate と IS_ARC の行は、この問題とは無関係だと思います。)
だから、私が根本的に正しく理解していないことがあります...