[解決済み] ARCおよびブリッジドキャスト
質問
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…
マクロは、プレーンなキャストよりもかなり重要です。
関連
-
[解決済み】何が原因か。switch文からこのcaseラベルにジャンプできない [重複]。
-
[解決済み] カスタムメイドのフレームワークで「セレクタ 'Hello:'の既知のクラスメソッドがありません」というエラーが発生する。
-
[解決済み] アトミック属性と非アトミック属性の違いは何ですか?
-
[解決済み] プロジェクト内の単一ファイルのARCを無効にするにはどうしたらいいですか?
-
[解決済み] IBOutletsはARCのもとで強くなるべきか、弱くなるべきか?
-
[解決済み】Cocoaでスタックトレースをコンソール/ログに出力するにはどうすればいいですか?
-
[解決済み】isEqual:とハッシュをオーバーライドするためのベストプラクティス
-
[解決済み】NSDateをNSStringに変換する。
-
[解決済み】Cocoaアプリからターミナルコマンドを実行する
-
[解決済み】iOSでメールアドレスが有効であることを確認する【重複あり
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Xcodeのビルド失敗 "アーキテクチャx86_64の未定義シンボル"
-
[解決済み] dispatch_after - GCD in Swift?
-
[解決済み] Objective-CでNSNumberをintに変換する。
-
[解決済み] インスタンスに送信されたセレクタが認識されない」を解決するには?
-
[解決済み] Objective-CでNSArrayを逆引きするにはどうしたらいいですか?
-
[解決済み】iOS7でステータスバーを隠すことができない。
-
[解決済み】idの代わりにinstancetypeを使い始めるのは有益でしょうか?
-
[解決済み】UITableViewからセパレータラインを削除する方法はありますか?
-
[解決済み】Objective-Cでクラスレベルのプロパティを宣言するにはどうすればいいですか?
-
[解決済み】Objective-Cでオブジェクトがどのクラスであるかをテストするにはどうすればよいですか?