手動のメモリ管理では、このパターンをかなり頻繁に使用します。
NSString * myStr = /* some local object */
[UIView beginAnimation:@"foo" context:(void *)[myStr retain]];
そして、後で非同期に:
- (void)animationDidStop:(NSString *)anim finished:(NSNumber *)num context:(void *)context
{
NSString * contextStr = (NSString *)context;
// ...
[contextStr release];
}
つまり、不透明なコンテキストとして使用されるオブジェクトの有効期間を手動で管理しました。(これは古い UIView アニメーションにも当てはまりますが、私が使用する他の種類の API にも当てはまります。)
ARC の下では、私の本能は、ここで提案されているように、ハンドラーに__bridge_retained
出入りしたいということです。しかし、これは Cocoa オブジェクトを として扱います。これは、実際にブリッジされているからではなく、保持を喉に突き刺すためだけです。__bridge_transfer
CFType
これは有効で、これはスタイル的に受け入れられますか? そうでない場合、より良い*解決策は何ですか?
(この質問で受け入れられた回答は、単独で問題ないと言って別の回答を与えます__bridge
が、最初の関数で範囲外になるとすぐに元の文字列の割り当てが解除されるリスクがあるため、それは間違っているように思えます。 右?)
※「代わりにブロックベースのアニメーションを使用してください」とは言わないでください。(それは私が尋ねていることではありません。)