3

CGImageRefをクラスの合成プロパティとして処理する方法について質問があります。CGImageRefを次のように定義すると

@property (nonatomic, retain) CGImageRef image;

次に、コンパイラは「保持」をここでは使用できないと文句を言います。保持を省略した場合は、代わりに「割り当て」が使用されていると想定し、プロパティを設定するときに自分で保持を行う必要があります。

self.image = CGImageRetain ( cgimage );

次に、Analyzeを実行すると、「潜在的なリーク」の警告が表示されます。この警告を安全に無視できますか?または、プロパティ定義で「保持」が指定されていない場合でも、合成コードは暗黙のCGRetainを実行しますか?

4

3 に答える 3

8

あなたがしたいのは、型が実際に保持できるという注釈をプロパティに追加することです。

プロパティ宣言をに変更します

@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))
于 2011-11-28T14:42:14.877 に答える
1

コンパイル時にコンパイラに指示するのは好きではありません。醜いと思います。私は自分でメソッドをオーバーライドします。

@interface MyClass : NSObject {
    CGImageRef _image;
}
@property (nonatomic, assign) CGImageRef image;
@end

@implementation MyClass
- (void)setImage:(CGImageRef)i {
    if(_image != i) {
        CGImageRelease(_image);
        _image = CGImageRetain(i);
    }
}

- (CGImageRef)image {
    return _image;
}
@end
于 2011-11-28T16:39:57.073 に答える
-1

これはどう?

@property (nonatomic, setter=setImage:) CGImageRef image;

(void)setImage:(CGImageRef)image {
    if (_image != image) {
        CGImageRelease(_image);
        _image = CGImageRetain(image);
    }
}
于 2018-02-27T23:59:30.320 に答える