0

記憶について質問があります。以下のコードとログによると0x6868190、リークはありますか?

コード:

self.point = [NSString stringWithFormat:@"R"];
NSLog(@"********First********%d",[point retainCount]);
NSLog(@"********First********%p",point);
self.point = [NSString stringWithFormat:@"A"];
NSLog(@"********Second********%d",[point retainCount]);
NSLog(@"********Second********%p",point);

ログ:

 2012-04-17 20:27:49.838 test_[297:f803] ********First********2
 2012-04-17 20:27:49.838 test_[297:f803] ********First********0x6868190
 2012-04-17 20:27:49.839 test_[297:f803] ********Second********2
 2012-04-17 20:27:49.839 test_[297:f803] ********Second********0x6879500
4

4 に答える 4

2

retainCount内部実装が予期しないようにメモリリークを変更する可能性があるため、メモリリークのチェックには使用しないでください。

xcodeにはリークをチェックするための適切なツールがあるので、それを使用することをお勧めします。

于 2012-04-17T12:48:12.513 に答える
1

私のウェブサイト「retainCountをいつ使用するか?」はこれをカバーしています。質問7と8を参照してください。

しかし、要約すると、違います。変数は自動解放されるため、リークすることはありません(で解放するのを忘れない限りdealloc)。

于 2012-04-17T12:48:20.563 に答える
1

Instrumentsを使用して、メモリリークをチェックします。保持カウントがゼロではない(または1を期待していたと思います)という事実は、必ずしもリークがあることを意味するわけではありません。これらのオブジェクトは、必要に応じて実行ループの最後に解放されます。

stringWithFormat呼び出しは、保持カウントが1のオブジェクトを作成します(これは自動解放されます)。次に、プロパティはおそらくretain / strongとして宣言されます。これにより、メインオブジェクトが解放されたときに解放されるプロパティが追加されます。したがって、2つです。

于 2012-04-17T12:54:20.687 に答える
0

いいえ。クラスNSStringによって生成されるものはです。NSStringautorealeased

于 2012-04-17T12:40:20.543 に答える