2

私は通常、次のような NSString を直接使用しています。

 self.text = @"word";
 label.text = @"word";
 function(@"word");

@"word" は、使用後に保持カウントが 2 になるため、NSString を直接使用するのは間違った方法だと思います。そうですか?

@"" のretainCountは正確には何ですか? 自動解放オブジェクトですか、それとも保持が 1 ですか?

さらに、以下に示す写真のように、メモリリークが発生しました。

ここに画像の説明を入力

NSString の直接使用に関連していると思われます。

4

4 に答える 4

7

基本的に、NSString リテラルの保持数は無限です。これらのオブジェクトのメモリは、コンパイル時にコンパイラによって予約され、アプリの実行中に解放されることはありません。それらを保持または解放する頻度に関係なくです。

これは、保持カウントを気にすることがなぜ間違っているかのもう 1 つの良い例です。ゴールデン メモリ管理ルールだけを気にする必要があります。オブジェクトの所有権を ( allocnewcopyまたはでretain) 取得した場合は、後でそれを解放または自動解放する必要があります。そうでなければ、あなたはしません。

于 2012-05-30T10:25:09.933 に答える
2

Stringプログラミングガイドからの引用

ソース コードで文字列オブジェクトを作成する最も簡単な方法は、Objective-C の @"..." コンストラクトを使用することです。

NSString *temp = @"/tmp/scratch";

この方法で文字列定数を作成する場合、7 ビット ASCII 文字以外は使用しないでください。このようなオブジェクトはコンパイル時に作成され、プログラムの実行中に存在します。コンパイラは、このようなオブジェクト定数をモジュールごとに一意にし、割り当てを解除することはありませんが、他のオブジェクトと同じように保持および解放できます。

于 2012-05-30T10:26:46.253 に答える
1

いいえ、@"" を直接使用して、自動解放された NSString を宣言するのは良いことです。しかし、NSString は特定の方法で保持され、実行時に何が行われているかを知ることは実際には不可能です。奇妙な保持カウントが時々あるかもしれません。48 バイトのリークについて気にしないでください.... nsstring とは関係ありません。

于 2012-05-30T10:27:02.957 に答える
1

@"word" は、使用された後、retainCount が 2 になります。そうですか?

いいえ。これは、内部実装の詳細である保持カウントの観点から考えるのがなぜ悪いのかを示す完璧な例です。文字列リテラルは、実行可能イメージによって「所有」される文字列と考えることができるため、消えません。これらは、他の Objective-C オブジェクトと同様に扱う必要があります。

文字列リテラルの保持カウントをこっそり覗いてみると、非常に大きな数値 ( の最大値のようなもの) に設定されていることがわかりますNSInteger。これは によって特別な値として扱われ、変更されretainませreleaseん。

文字列リテラルのメモリは、コンパイル時にバイナリ イメージの一部として割り当てられます。それは決して消えることはありません。あなたのメモリリークはこれが原因ではありません。

于 2012-05-30T10:41:56.680 に答える