0

私は1つのプロパティを言う

@property(nonatomic,assign) NSString *str;

今、私は次のようなものを持っています

self.str = [[NSString alloc] init];
self.str = @"test";
NSLog(@"%@",str);
[self.str release];

実行すると、「メモリリークの可能性」というリークが表示されます。

なぜリークが表示されるのですか?

iOSの段階に傾いている私を案内してください

4

3 に答える 3

5

言い換えれば (ここで Anoop の回答を拡張しているだけです)、1 つではなく 2 つの文字列があります。

self.str = [[NSString alloc] init];
self.str = @"test";

最初の行の右側にあるのは文字列です: [[NSString alloc] init]. しかし、2 行目ではそれを破棄して、別の文字列、つまり@"test". 現在、最初の文字列を指す参照はありません。したがって、それは決して解放されることはなく、それに対して、またはそれのために他のことを行うこともできないため、漏れます。

1 行目で作成された文字列の状況は、2 行目以降、この図の 2 番目のパネルの「thing1」の状況のようになります。

ここに画像の説明を入力

誰も指摘していないので、その記憶を管理することはできず、隔離されたまま永遠に生き続けます (リーク)。

于 2013-04-11T17:53:54.290 に答える
3
self.str = [[NSString alloc] init]; //1st

1 つの文字列が割り当てられ、使用されません。

self.str = @"test";  // 2nd

別の定数文字列「test」が割り当てられますが、解放されます。

だから最初の1つは漏れです。

于 2013-04-11T17:50:57.323 に答える
2

ファクトリ メソッドを使用するか、alloc、new、retain、copy、mutableCopyを使用してオブジェクトを作成すると、オブジェクトの保持カウントが毎回+1になります。この場合、あなたはオブジェクトを所有しています。あなたはそれを解放する責任があります。そのため、オブジェクトの保持カウントが -1になるオブジェクトの使用が終了したら、オブジェクトを解放する必要があります。

すでにプロパティを作成しているため、文字列を再度割り当てる必要はありません。

そして、ゲッターセッターがあり、再度割り当てているため、リークが発生します。

于 2013-04-11T18:04:30.593 に答える