17

私は最近、Automatic Reference Counting(ARC)を使って新しいプロジェクトを開始しました。
IはCALayerの内容割り当てられた場合:ARCはCore Graphicsオブジェクトで動作しますか?

UIView* view = ... 
UIImage* image = ... 
view.layer.contents = image.CGImage 

を私が 'ID' への非Objective-Cのポインタタイプ 'CGImageRef' の誤差

暗黙の変換がARCで禁止され得単にidCGImageRefをキャスト

はエラーを隠しますが、ARCはまだ、その後正常に機能している場合、私は思っていましたか?

答えて

42

WWDC 2011のARCビデオを実際にチェックアウトしてください。デベロッパーサイトで利用でき、iTunesで開くことができます。

https://developer.apple.com/library/content/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html:とくに:また深さでのObjective-Cの進歩

、ARCのリファレンス・ノート - セッション323•

- セッション322•

を数える自動リファレンスの紹介

リファレンス・ノートとビデオの両方で、Core Graphics(et al)とARCとの連携について説明しています。

具体的に、あなたは、Core Foundationのスタイルオブジェクトを使用する必要があり、多くのCocoaアプリケーションで「の管理フリーダイヤルブリッジング」

と呼ばれるセクションを見て(例えばCore Foundationのフレームワーク自体からか CFArrayRefまたはCFMutableDictionaryRef)、またはコアグラフィックスなどの Core Foundationの規約(CGColorSpaceRefおよびCGGradientRefのようなタイプ を使用する可能性があります)を採用しているフレームワークです。

コンパイラは、コア Foundationオブジェクトのライフタイムを自動的に管理しません。 Core Foundationメモリ管理規則(「コア管理のためのメモリ管理プログラミング ガイド」を参照してください)によって指示されているように、CFRetainおよびCFRelease(または対応するタイプ固有のバリアント)を呼び出す必要があります。あなたはObjective-CのとCore Foundationのスタイルのオブジェクト間でキャストすると

、あなたは(にObjC/runtime.hで定義されている)キャストまたはCore のいずれかを使用して、オブジェクト の所有権の意味についてコンパイラに指示する必要があり (NSObject.hで定義されている)財団スタイルのマクロ:[...]

イェルク・ヤコブセンは、同様にブリッジングオプションの良い要約の概要があります:Managing Toll-free Bridging in an ARC’ed Environment

__bridge_retained(n.b.:オブジェクトポインタからC型ポインタへのキャスト時にのみ使用します):私(プログラマ)は、 あなた、ARCには不透明なC型ポインタの暗い世界でしばらくこのオブジェクトを参照する必要があります。だから、私はまだ が必要な間にこのオブジェクトを解放しないでください。 I(プログラマ)(暗い 世界では)それを自分自身を解放することを約束私は(NB:Cのポインタ型からキャストする場合のみ、ポインタをオブジェクトに使用):__bridge_transferそれに

をやってるI(プログラマー)はあなたにARC、私が所有している オブジェクトを渡して、暗闇の中ではもはや興味がなくなっています。 あなたに不透明なCタイプのポインタの世界。 が適切な時間を知っているので、あなた自身、ARC、そのオブジェクトで行われた は、あなた自身でリリースしてください。

__bridge:ARC、私は が...あるC型ポインタの暗い世界に地雷を均衡に保つよう、あなたの保持と解放を均衡に保ちます。暗い世界の物体をつかんでおく必要があるときはいつでも、私は 自分でそれを保持し、適切なときにそれを解放するでしょう。私は、あなたとARCとの間に特別の契約を結ぶ必要はありません。

+0

非常に有用で完全な答えです、ありがとうございます – Pieter

+0

:)ありがとう!お役に立てて嬉しいです!私たちは数日前にかなり大きなアプリを移行しましたが、すべての不具合を解消するのに約2日かかりましたが、私は最終結果に非常に満足しています。多くのコードが少なく、より堅牢です。 ARCはかなりクールです。それらのビデオは私にとって素晴らしいリソースでした。 – Steve

+0

+1はJorg Jacobsenの説明を引用しています。 – jAckOdE

8

スティーブが指摘している参考文献にもかかわらず、上記のケースが特別な場合があります。 Transitioning to ARC Release Notesからは、「コンパイラは、CFはココアメソッドから返されるオブジェクトのハンドル」に注意を払う:

コンパイラは、コア 財団タイプは歴史的ココアの命名規則に従って返すObjective-Cのメソッドを理解する(参照 アドバンストメモリ管理プログラミングガイド)。たとえば、 コンパイラは、iOSでは、UIColorのCGColor メソッドによって返されたCGColorが所有されていないことを認識しています。

コード例、彼らが提供しています

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

は(彼らは私がする必要があります上記のコードに追加したIDにキャストが欠落しているこれらのメソッドからCGColorsの既知の復帰に依存していますすぐにドキュメントで修正されました)。

[image CGImage]は命名規則に従っているため、ここではCGImageが正しくブリッジされると思います。私はあなたのキャストがあなたがここに必要なすべてでなければならないと思う。

4

layer.contents = (id)image.CGImageのよくあるお問い合わせはlayer.contents = obj_unretainedObject(image.CGImage)です。

私は=(__bridge id)image.CGImageです。

+0

可読性を高めるために、回答にコードの書式を追加することをお勧めします。 –