0
@interface Foo : NSObject

@property (nonatomic, retain) Bar * bar;

@end

@implementation Foo

@synthesize bar = _bar;

- init {
    self = [super init];
    if (self) {

        _bar =  [[Bar alloc] init];

        // Or 

        _bar =  [[[Bar alloc] init] autorelease];


    }
    return self;
}

- (void)dealloc {
    [_bar release];
    [super dealloc];
}

@end

アナライザーを実行すると、両方

        _bar =  [[Bar alloc] init];

        _bar =  [[[Bar alloc] init] autorelease];

は大丈夫です。

どちらを使うべきですか?

4

2 に答える 2

4

最初のものを使用する必要があります。保持されたオブジェクトを作成しますが、保持する2番目の「自動解放」。

重要な考慮事項は、インスタンス変数_barに割り当てることです。代わりに、プロパティに割り当てる場合は、プロパティ宣言self.barのディレクティブによってオブジェクトが保持されるため、自動解放された値を割り当てるのが適切です。retainただし、代わりに「ベア」インスタンス変数に割り当てるため、保持を自分で処理する必要があります。したがって、最初のフォームが必要です。

PS:アナライザーが2番目のバージョンについて文句を言わないことに少し驚いています。

PPS:ここでの選択はコンテキストに大きく依存することに注意してください。ただし、選択を行うのに十分なコンテキスト(プロパティ定義)を含めました。プロパティの定義(またはプロパティ以外の場合は他の情報)を見なければ、言うのは難しいでしょう。

于 2012-12-09T03:21:14.787 に答える
2

バージョンが正しくないため、autorelease状況によってはクラッシュが発生する可能性があります。最初の行_barの保持カウントがになり、不要になったときに終了1するまでそのままになります。release-dealloc

ただし、2行目では、オブジェクトがすぐに解放されるため(具体的には、実行ループの終了時に)、必要なときにオブジェクトが消える可能性があります。

詳細については、メモリ管理に関するアップルのガイドをお読みください。

于 2012-12-09T03:21:22.143 に答える