あなたがしたいのは、型が実際に保持できるという注釈をプロパティに追加することです。
プロパティ宣言をに変更します
@property (nonatomic, retain) CGImageRef image __attribute__((NSObject));
これはゲッターとセッターのみを生成することに注意してください。インスタンス変数自体はARC制御されていません。具体的には、これはでリリースするdealloc
必要があり、インスタンス変数に直接割り当てる場合は適切な保持とリリースを使用する必要があることを意味します。
より良いアプローチは、typedef
:を使用することです。
typedef CGImageRef CGImageObject __attribute__((NSObject));
@property (nonatomic, retain) CGImageObject image;
この場合、インスタンス変数はARCによって制御されるため、で解放しないdealloc
でください。インスタンス変数への直接割り当てもARCによって処理されます。
参考までに、仕様、特にセクション4.1.1を参照してください。
保持可能なオブジェクトポインタ型ではないプロパティに適用する__attribute__((NSObject))
と、ARCの外部で行うのと同じ動作になります。つまり、プロパティ型が何らかのポインタである必要があり、。以外の修飾子を使用できますassign
。これらの修飾子は、合成されたゲッターとセッターにのみ影響します。ivarへの直接アクセス(合成された場合でも)にはまだプリミティブなセマンティクスがあり、ivarの値は割り当て解除中に自動的に解放されません。
およびセクション3:
保持可能なオブジェクトポインタ(または「保持可能なポインタ」)は、保持可能なオブジェクトポインタタイプ(「保持可能なタイプ」)の値です。保持可能なオブジェクトポインタタイプには、次の3種類があります。
- ブロックポインタ(関数型にcaret(
^
)宣言子シジルを適用することによって形成されます)
- Objective-Cオブジェクトポインタ(
id
、、、Class
などNSFoo*
)
- でマークされたtypedef
__attribute__((NSObject))