2011-07-12 7 views
1

は、私は基本的に私がいた、しかし私は客観C:リリースとのalloc

は、だから私は動作するように私にしばらく時間がかかった問題に遭遇したこの答えを見つけることができない、CとObjective Cにかなり新たなんですこれまでにオブジェクトを割り当てたときに解放する必要があると言いました。だから、それは私がやったことで、それは私のプログラムがクラッシュする原因と...ここで

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

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

私はそれが理由「numberString = resultLabel.text」行のだ、なぜ私は考え出したと思いますしかし、私はなぜプログラムがクラッシュするのか分からない。なぜnumberStringを公開できないのですか?私はそれがメモリリークを引き起こすでしょうか?

P.S.私はコードが不器用であることを知っている、私はプログラミングの初心者であり、客観的Cへのさらに新しい初心者です。

P.S.S.私はresultLabelを後で - (void)dealloc {}にリリースします。

答えて

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; 
+0

うわー、すばやく/分かりやすい返信をいただきありがとうございます。 – rafal

+1

オブジェクトが自動リリースされているかどうかは、実装の詳細です。気にする必要があるのは、オブジェクトを所有しているかどうかだけです。 – albertamg

2

あなたはそうです!書くことによって:

numberString = resultLabel.text; 

あなたは今resultLabel.textのStringインスタンスを参照していて、それを解放しようとしているとき、その文字列は、あなたによって割り当てられていないので、それは、エラーになりますので、あなたが解放してはいけませんそれ。

ObjectStringの後ろにあるテキストを参照しているだけの場合は、NSString(ポインタ)型の変数が必要で、NSStringの新しいインスタンスは必要ないため、最初の行を省略してください。

[編集] NSStringオブジェクトを割り当ててインスタンス化することで、決して使用しないで、リリースしないNSStringオブジェクトを確保します(NSStringを他のどこかにリリースされているラベルから解放しようとします)メモリリークが発生しました。

+0

さらにnumberStringにはリークがあります。 – dasdom

+0

okありがとうございました – rafal

2

変更最初の2行に:NSStringのインスタンスとして

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

は、あなたがそれを初期化した後で、その値を設定することはできません不変です。あなたのコードで何をしているのかは、ポインタを設定することです。

+0

なぜあなたは 'NSString * numberString = resultLabel.text;'や 'NSString * numberString = [resultLabel.text retain];' – JeremyP