ARCはコアグラフィックオブジェクトで動作しますか?
-
22-10-2019 - |
質問
最近、自動参照カウント(ARC)を使用して新しいプロジェクトを開始しました。
カレイヤーの内容を割り当てたとき:
UIView* view = ...
UIImage* image = ...
view.layer.contents = image.CGImage
エラーが発生しました
非目的Cポインタータイプ「CGIMAGEREF」から「ID」への暗黙の変換は、ARCで許可されていません
単にキャストします CGImageRef
に id
エラーを隠していますが、アークがまだ正しく機能しているのではないかと思っていましたか?
解決
WWDC 2011のARCビデオを本当にチェックアウトする必要があります。それらは開発者サイトで入手でき、iTunesを通じて開いています。特に:
•セッション323 - 自動参照カウントの導入
•セッション322 - 目的Cの進歩を深く掘り下げます
また、ARCリファレンスノート:
リファレンスノートとビデオの両方で、コアグラフィックス(et al)とそれらがARCでどのように機能するかについて説明します。
具体的には、呼ばれるセクションを見てください 「フリーブリッジングの管理」
多くのCoCoAアプリケーションでは、Core Foundation Framework自体(CFarrayrefやCFMUTABLEDICTIONARYREFなど)から、またはコアグラフィックスなどのコアファンデーションコンベンションを採用するフレームワーク(CGColorsPacerefやCGRGROORSPACEREFなどのタイプを使用する場合でも、コアファンデーションスタイルのオブジェクトを使用する必要があります。 )。
コンパイラは、コアファンデーションオブジェクトの寿命を自動的に管理しません。 Core Foundation Memory Management Rulesによって指示されているように、CfretainとCfrelease(または対応する型固有のバリアント)を呼び出す必要があります(Core Foundationのメモリ管理プログラミングガイドを参照)。
Objective-CとCore Foundationスタイルのオブジェクトの間でキャストする場合、キャスト(OBJC/Runtime.Hで定義)またはCore Foundationスタイルのマクロ(で定義されている)を使用して、オブジェクトの所有権セマンティクスについてコンパイラに伝える必要があります。 nsobject.h):[...
JörgJacobsenには、ブリッジングオプションの概要の概要もあります。 アーク環境でのフリーダイヤルブリッジングの管理.
__bridge_retained (NB:オブジェクトポインターからCタイプポインターにキャストするときにのみ使用します):I(プログラマ)は、あなたに不透明なCタイプポインターの暗い世界でしばらくこのオブジェクトを参照する必要があります。だから、私がまだ必要なときにこのオブジェクトをリリースしないでください。私(プログラマー)は、私がそれを終えたときにそれを自分でリリースすることを約束します
__Bridge_Transfer (NB:C Typeポインターからオブジェクトポインターにキャストするときにのみ使用します):i(プログラマー)あなたに手渡し、ARC、私が所有しているオブジェクトであり、私がもうCタイプポインターの暗い世界に興味がないことそれはあなたにとって不透明です。アークがそのオブジェクトで完了するたびに、自分でリリースしてください。
__橋: :arc、あなたは保持のバランスを取り続け、リリースを解放し続けます。暗い世界のオブジェクトを保持する必要があるときはいつでも、私はそれを自分で保持し、必要に応じてそれをリリースします。あなたとの追加契約は必要ありません、アーク。
他のヒント
スティーブが指摘した参照にもかかわらず、上記の場合は特別な場合があると思います。から アークリリースノートへの移行, 、セクション「コンパイラは、ココアメソッドから返されたCFオブジェクトを処理する」セクションに注意してください。
コンパイラは、Core Foundationタイプを返すObjective-Cメソッドを理解しています。たとえば、コンパイラは、iOSでは、uicolorのcgcolor法によって返されるcgcolorが所有されていないことを知っています。
彼らが提供するコードの例:
gradientLayer.colors = [NSArray arrayWithObjects:(id)[[UIColor darkGrayColor] CGColor],
(id)[[UIColor lightGrayColor] CGColor], nil];
これらのメソッドからのcgcolorsの既知のリターンに依存しています(上記のコードで追加したIDにキャストが欠落しているため、すぐにドキュメントで修正する必要があります)。
なぜなら [image CGImage]
命名規則に従って、ここではcgimageが適切に橋渡しされると思います。 IDへのキャストは、ここで必要なものすべてであると思います。
1つの一般的な答え layer.contents = (id)image.CGImage
質問は layer.contents = obj_unretainedObject(image.CGImage)
.
そうです =(__bridge id)image.CGImage
.