2010-11-21 8 views
6

でCGGradientRefを保存するためにどのように私はNSMutableArrayの中CGGradientRefを格納する作業に問題が生じています。 配列に格納するために何をラップする必要があり、何をラップしないのですか?NSMutableArrayの

ありがとうございました。

答えて

12

あなたは何にでもラップする必要はありません。 idにキャストして配列に追加してください。これは、CFTypeから派生したCoreFoundationタイプ(「Ref」で終わるすべてのもの)に対して行うことができます。

また、あなたはCFMutableArrayRefにNSMutableArrayの*をキャストし、()CFArrayAppendValueを呼び出すことができます。これはもうタイプセーフではありません。配列の作成時に指定されたretain/releaseコールバックが呼び出されます。 (例外的な例外として、キーをコピーする - [NSDictionary setValue:forKey:]がありますが、対応するCFDictionary関数はそうではありません。 -farを値として使用します)、ハッシュが変更されないという要件に違反しない限り、安全です。)

CoreFoundationタイプは、「プレーン」で使用できるOOタイプです。 (AppleはCFとObjCの両方のランタイムを書くので、Appleはこれを行うことができます)、NSString、NSArray、NSDictionaryのような型のインスタンスは(デフォルトで)CFString、CFArray、CFDictionaryの "本当の"インスタンスです。 CF型は型階層にあり、その根元はCFTypeです。注目すべきメソッドは、CFRetain、CFRelease、CFEqual、CFHash、およびCFCopyDescriptionです。これらは、-retain、-release、-isEqual :, -hash、および-descriptionにゆるやかに対応します(ただし、-descriptionはさらに自動解放され、NULL/nilの処理が異なります)。 Appleはこの「フリーダイヤル・ブリッジ」または「互換性のあるデータ型」と呼んでいます(IDTの記事はもはやMac Dev Centerにはありません)。 Ridiculousfishは"Bridge"と呼ばれる良い記事を持っています。

これが意味することは、彼らはObjective-Cのオブジェクトであるかのようにあなたは、ほとんどの部分は、CFタイプを扱うことができるということです。 Appleはこれを特に明示していませんが、「フリーダイヤル・ブリッジ」という言葉に加えて、交換可能であると仮定しているものもあります。

  • NSMakeCollectable()はCFTypeRefを取得し、idを返します(iOSでは無関係ですが、Mac OS 10.5以降では関連性が高いガベージコレクションを有効にします)。
  • 効果的に「それを-retain送信し、Objective-Cのインスタンスであるかのように-release」を意味@property (nonatomic, retain) __attribute__((NSObject)) ABAddressBookRef foo;ようなもの。
  • CALayer.contentsプロパティはid型を持つが、それはサポートする唯一の文書化の事はCGImageRef(それも-drawRectものですCABackingStore、サポートされています。に描画を)です。

さらに楽しいことは、CFAutoreleaseを定義することです。

+0

ありがとうございました。 – Cyprian