1. ホーム
  2. objective-c

[解決済み] ARCおよびブリッジドキャスト

2022-04-30 07:40:42

質問

ARCを使用すると、キャストできなくなります。 CGColorRef から id . ブリッジドキャストをする必要があることを知りました。それによると クラングドックス :

<ブロッククオート

A ブリッヂキャスト は、3つのキーワードのうちの1つで注釈されたC言語スタイルのキャストです。

(__bridge T) op オペランドを出力型にキャストします。 T . もし T が保持可能なオブジェクトポインタ型であれば op を持つ必要があります。 非保持型ポインタ。もし T は保持できないポインタ型です。 の場合、opは保持可能なオブジェクトポインタ型でなければならない。そうでない場合は、キャスト は不正な形式です。所有権の移転はなく、ARCは何も挿入しません。 を保持する操作です。

(__bridge_retained T) op オペランドをキャストします。 保持可能なオブジェクトポインタ型でなければなりません。 非保持型ポインタです。ARCはその値を保持します。 ローカル値に対する通常の最適化であり、受信者の責任です。 のバランスをとる。

(__bridge_transfer T) op オペランドをキャストします。 非保持型ポインタを宛先の型に変換します. 保持可能なオブジェクトポインタ型。ARCはその値を最後に解放します。 を囲む完全な式は、通常の最適化の対象となります。 ローカルな値に対して

これらのキャストは、オブジェクトの転送を行うために必要です。 ARCの制御; の変換のセクションの理論的根拠を参照してください。 保持可能なオブジェクトポインタ。

を使用することで __bridge_retained または __bridge_transfer を説得するために純粋にキャストされた ARCがアンバランスなリテンションやリリースを行うのは、不適切な行為です。 という形になります。

それぞれどのような場面で使うのでしょうか?

例えば CAGradientLayer には colors の配列を受け付けるプロパティです。 CGColorRef s. 私が思うに __brige しかし、なぜそうするのか(あるいはそうしないのか)、その理由は不明である。

どのように解決するのですか?

説明がわかりにくいのは同意します。私も把握したばかりなので、要約してみます。

  • (__bridge_transfer <NSType>) op または、その代わりに CFBridgingRelease(op) のretain-countを消費するために使用されます。 CFTypeRef をARCに転送している間。また、これは id someObj = (__bridge <NSType>) op; CFRelease(op);

  • (__bridge_retained <CFType>) op または、その代わりに CFBridgingRetain(op) を渡すために使用されます。 NSObject をCFランドに渡し、保持数を+1しています。を処理する必要があります。 CFTypeRef の結果を処理するのと同じです。 CFStringCreateCopy() . これはまた、次のように表現することもできます。 CFRetain((__bridge CFType)op); CFTypeRef someTypeRef = (__bridge CFType)op;

  • __bridge はポインタランドとObjective-Cのオブジェクトランドの間でキャストを行うだけです。もし、上記の変換を使う気がないのなら、これを使いましょう。

もしかしたら、これが参考になるかもしれません。私自身は CFBridging… マクロは、プレーンなキャストよりもかなり重要です。