169

ARC では、 にキャストできなくなりましCGColorRefid。ブリッジキャストを行う必要があることを学びました。clang docsによると:

ブリッジされたキャストは、次の 3 つのキーワードのいずれかで注釈が付けられた C スタイルのキャストです。

(__bridge T) opオペランドを宛先 type にキャストしますTT が保持可能なオブジェクト ポインター型である場合、保持op不可能なポインター型である必要があります。が保持不可能なポインター型である場合T、op は保持可能なオブジェクト ポインター型である必要があります。そうしないと、キャストの形式が正しくありません。所有権の譲渡はなく、ARC は保持操作を挿入しません。

(__bridge_retained T) op保持可能なオブジェクト ポインター型である必要があるオペランドを、保持不可能なポインター型である必要がある宛先の型にキャストします。ARC はローカル値の通常の最適化に従って値を保持し、受信者はその +1 のバランスをとる責任があります。

(__bridge_transfer T) op保持不可能なポインター型である必要があるオペランドを、保持可能なオブジェクトポインター型である必要がある宛先の型にキャストします。ARC は、ローカル値の通常の最適化に従って、囲んでいる完全な式の最後で値を解放します。

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

__bridge_retainedorキャストを純粋に使用して、__bridge_transferARC に不均衡な保持または解放をそれぞれ出力させることは、不適切な形式です。

それぞれどんなシチュエーションで使うの?

たとえば、 の配列を受け入れるプロパティがありCAGradientLayerます。私の推測では、ここで使用する必要がありますが、なぜ使用する必要があるのか​​ (または使用しないのか) は明確ではありません。colorsCGColorRef__brige

4

3 に答える 3

217
于 2011-08-31T18:23:59.907 に答える
33

フォローオンとして、この特定のケースでは、iOS を使用している場合、Apple は UIColor とその-CGColorメソッドを使用して CGColorRef をcolorsNSArray に返すことをお勧めします。Transitioning to ARC Release Notesの「The Compiler Handles CF Objects Returned From Cocoa Methods」セクションの下で-CGColor、Core Foundation オブジェクトを返すようなメソッドを使用すると、コンパイラによって自動的に適切に処理されることが示されています。

したがって、次のようなコードを使用することをお勧めします。

CAGradientLayer *gradientLayer = (CAGradientLayer *)[self layer];
gradientLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor darkGrayColor] CGColor],
                                                 (id)[[UIColor lightGrayColor] CGColor], nil];

現時点では、Apple のサンプル コードには、上記の (id) キャストがありません。これは、コンパイラ エラーを回避するためにまだ必要です。

于 2011-10-18T03:28:57.463 に答える