1

私はCとObjectiveCにかなり慣れていませんが、この答えが見つかりません

それで、私は解決するのに時間がかかった問題に遭遇しました、基本的に私はあなたがオブジェクトを割り当てるときはいつでもそれを解放するべきであると言われました。それが私がしたことであり、それが私のプログラムをクラッシュさせました...

コードは次のとおりです。

NSString *numberString = [[NSString alloc] init];
numberString = resultLabel.text;
[self setFirstNumber:[numberString doubleValue]];
[resultLabel setText:@"0"];
[numberString release];

「numberString=resultLabel.text」行が原因である理由はわかったと思いますが、プログラムがクラッシュする理由がわかりません。numberStringをリリースできないのはなぜですか?そうしないと、メモリリークが発生しますか?

PSコードが不器用であることはわかっています。私はプログラミングの初心者であり、ObjectiveCの初心者です。

PSS後でresultLabelを-(void)dealloc{}でリリースします

4

3 に答える 3

5

numberStringは、割り当てたメモリを指すことを意味するポインタです。最初の行では、はい、alloc / initを呼び出し、それを解放する責任があります。次の行では、自分が所有していない別の値にポインタを設定し、allocを呼び出した元の文字列がリークされています。への呼び出し[[NSString alloc] init]はまったく無意味ですが、リリースを使用した例を次に示します。

NSString *numberString = [[NSString alloc] init]; //Not necessary
[numberString release]; //Properly released now it is safe to reassign
numberString = resultLabel.text; 
//numberString is now pointing at another object

[self setFirstNumber:[numberString doubleValue]];
[resultLabel setText:@"0"];
//No need to release it any more here

やりたいことは、numberStringをテキストに設定するだけで、リリース呼び出しは使用しません。

NSString *numberString = resultLabel.text;
于 2011-07-12T14:37:29.670 に答える
2

あなたが正しい!書くことによって:

numberString = resultLabel.text;

resultLabel.textのStringインスタンスを参照していますが、解放しようとするとエラーになります。そのStringはユーザーによって割り当てられていないため、解放しないでください。

resultLabelの背後にあるオブジェクトからテキストを参照している場合は、NSString(ポインタ)型の変数が必要であり、NSStringの新しいインスタンスは必要ないため、最初の行を省略してください。

[編集]dasdomが正しく述べたように、最初の行にNSStringオブジェクトを割り当ててインスタンス化することで、使用したり解放したりすることはありません(NSStringを別の場所で解放されているラベルから解放しようとします)メモリを作成しましたリーク。

于 2011-07-12T14:37:18.863 に答える
2

最初の2行を次のように変更します。

NSString *numberString = [[NSString alloc] initWithString: resultLabel.text];

NSStringのインスタンスは不変であるため、初期化した後でその値を設定することはできません。コードで行っているのは、ポインターの設定です。

于 2011-07-12T14:38:20.870 に答える