2009-03-05 17 views
2

NSStringに問題があります。NSStringのメモリ問題

NSString* str = [[NSString alloc] initWithString:@"Hello world"]; 

上記のコードでは、オブジェクトstrを解放する必要がありますか?ルールによると、このオブジェクトはallocで作成されるため、releaseメソッドで明示的に解放する必要があります。しかし、私が明示的にリリースしていないとき、私はインストゥルメンツでメモリリークを見つけることができません。 NSStringをNSNumberに置き換えると、メモリリークが発生します。

誰でも私にいくつかの提案を教えてもらえますか?ありがとう。

答えて

5

はい、リリースする必要があります。 Instruments、Leaks、ObjectAlloc、friendsなどのツールは間違いありません。また、インスタンスを作成するために定数文字列を使用したため、リークが発生していない可能性があります。それにもかかわらず、あなたが+allocオブジェクトの場合は、-releaseオブジェクトがリークしないようにする必要があります。したがって、実際にこのオブジェクトを解放する必要があります。ココアのメモリ管理の記事へのリンクの

私のいつものセット:http://iamleeg.blogspot.com/2008/12/cocoa-memory-management.html

3

あなたが見ている何がおそらく実装の詳細です。私は-[NSString initWithString:]の引数に不変の文字列をつけて、その引数を保持してそれを返すと思う。 @"Hello world"のような定数の文字列の場合、プログラムの実行中はハングアップしますので、retainとreleaseは何もしません。

しかし、あなたはそれに注意する必要はありません。ココアは、メモリ管理ガイドラインに従えば、メモリが適切に管理されることを保証します。シーンの背後で正確にどのように動作するのかは、あなたが気にするべきことではありません。ルールを守っているかどうかだけです。

+1

別の言い方をすると、ルールに従って、あなたのアプリは漏れない(どこかにバグがない)。ルールに従わないで、いつかはあなたのアプリがいつか漏れてしまうでしょう。 –