2

CFArrayRef私たちが知っているように、無料のブリッジ型とやなどの目的の c 型の間の変換は非常に簡単NSArrayです。CGImageRef昨日、 (ツール不要のブリッジ型ではない) をid次のように変換するコードを見つけました。

CALayer *imgLayer = [CALayer layer];  
imgLayer.contents = (id)aImage.CGImage;

ただし、正常に動作します。CGImageRefしかし、アップルのドキュメントによると、無料のブリッジ型に属していないため、わかりません。2 行目のコードを見てくださいimgLayer。プロパティの内容に割り当てられた値を保持する必要があります。CGImageRefに変換されるためid、プロパティ コンテンツのセッター メソッドでは、このようにそのオブジェクトに保持メッセージが送信されると思います[xxx retain]。しかしaImage.CGImage、オブジェクトではないので、この保持メッセージが正しく実行されるとは思いません (ただし、そうなるでしょう)。だから私の質問は、この変換の背後にある実際のアクションは何ですか?

4

1 に答える 1

2

これらのメソッドは、Apple が便宜上追加したルールの例外です。コンパイラは Objective-C の命名規則と暗黙のメモリ管理を認識しているため、Objective-C 関数によって返される Core Foundation オブジェクトは自動的に変換され、正しく処理されます。

このドキュメントの「Cocoa メソッドから返されたCF オブジェクトをコンパイラが処理する」セクションを参照してください。

フリーダイヤルブリッジングは、少し時代遅れの用語です。これは、Core Foundation C オブジェクトと Objective-C オブジェクトの間のシームレスなキャストを指していました。ただし、ARC では、対応するオブジェクトをブリッジした後にどうするかについてコンパイラがヒントを必要とするため、移行はもはやシームレスではありません。ただし、この場合は、メソッドの命名規則からヒントを得ています。

さらに、すべての Core Foundation オブジェクトは、基本的に Objective-C オブジェクトにキャストできます。対応する型がない場合、それらは単純に、NSCFTypeこの目的のために設計された特別なキャッチオール クラス ( ) になります。

于 2013-01-16T04:00:01.160 に答える