1

次のように宣言された変数があります。

@property (nonatomic, retain) NSMutableArray *aInfo;

最初に、次のように変数を宣言すると:

self.aInfo = [[NSMutableArray alloc] init];

アプリのすべてのポイントで、ブレーク ポイントで実行を停止し、変数の内容を次のように出力できます。

po self.aInfo

しかし、autorelease を使用して変数を宣言すると (そうあるべきです)、ブレークポイントでコンテンツが表示されなくなります...

self.aInfo = [[[NSMutableArray alloc] init] autorelease];

PD: NSLog(@"%@", self.aInfo) のようなことをすると、コンテンツが表示されます...

4

1 に答える 1

1

autorelease で変数を宣言した場合(そうあるべきです)...

あってはならないことです。これを試して:

NSMutableArray *aNewArray = [[NSMutableArray alloc] init];
self.aInfo = aNewArray;
[aNewArray release];

または、自動解放プールにあり、所有していない便利なメソッドを使用して、直接割り当てることができます。

self.aInfo = [NSMutableArray array];

また:

self.aInfo = [NSMutableArray arrayWithCapacity:20]; // use whatever number makes sense

プロパティを「保持」するように設定すると、それが実行されることに注意してください。合成されたアクセサーは古い割り当てを解放し、新しい割り当てを保持します。そのため、割り当てられたインスタンスを直接割り当てると、そのインスタンスが 2 回保持され、メモリ リークが発生します。*

*編集: 以下の deanWombourne のコメントを参照してください。alloc] init] autorelease保持されたプロパティに直接代入してもメモリ リークが発生しないためです。しかし、それがメモリ効率的であるとは確信していません。

于 2012-04-05T12:44:05.410 に答える