2011-12-22 8 views
0

これは初心者の質問です。 私は今日変数新しい文字列を必要とするので、私はこのようなものでした:新しい文字列を初期化する

NSString* newString = nil; 
if(something) 
newString = @"a value"; 
else 
newString = @"different value"; 

をし、それがうまく働きました。それでも、私は、メモリの割り当てについて少し知っている、と私は、これは何とか問題を引き起こす可能性がある恐れので、私は最後にコードを変更:それは私が以前に何をしたか悪い習慣

NSString* newString = [NSString stringWithFormat:@""]; 
if(something) ... 

ですか? 私はいくつかの変数が自動的に割り当てられることを知っていますので、allocを呼び出す必要はありませんが、nilとしても初期化しないでしょうか? この質問は愚かに聞こえるならば、私は[編集] これは、@対ゼロについての質問ではありません

nilを..私は、PHPからObjective-Cのに来て、メモリ管理についての私の知識が近くにあり、ごめんなさい""; 私の質問は、単純にNSString = something(nil、@ ""、@ "a value")を使用しても問題がない場合です。一般的には、オブジェクトに対してこれを実行しても問題ありません。例えば は、代わりifの両方の分岐がnewStringに値を割り当てるので、私は単にNSRandomObject = aValue;

答えて

2

を行うことができNSRandomObject = [[NSRandomObject* alloc] init];を行う前ifの割り当ては影響を及ぼしません。

文字列をnilと初期化するかどうかを決定することは、アプリケーションレベルの決定であり、「文字列はありません」と「文字列はありますが、空の"。

+0

もちろん、それは効果がありません、それはアイデアです:私はNSString * theString = @ "何か"を使用することはできません。それが正しく宣言されていないと私に教えてくれるので、if内部、そしてelse内部のtheString。だから私はif/else構造の前に空のinitを使ったのです。 – BBog

+1

@BogdanBucur 'if 'の両側で値をオーバーライドする場合(つまり無条件​​に)、' nil'に初期化するほうが良いです。 – dasblinkenlight

+0

ありがとう、それは私が知る必要があったものです!私はあなたの助けに感謝します – BBog

2

接頭辞が@の文字列は、プログラムコードに1回だけ格納され、静的アドレスとして使用されます。彼らの記憶を心配する必要はありません。 stringWithFormatを使用して実際に

は、単に @"string"

楽しい実際よりも多くのメモリを占有:変数に代入するとき@"this is a very long string"は、nilと同じくらいのメモリを占めています。両方とも単なるメモリアドレスです。もちろん、文字列はメモリ内のどこかに格納されますが、コード全体で再利用することができます。

+0

それは本当に楽しい事実です。それでも、if/else構造体で変数を使用できるようになる前に、変数を宣言する必要があることは私に関係しています。だから私はそれを何もしないように宣言し、その後正しい値を与えることは大丈夫ですか? – BBog

+2

ポインタの内容は常に4バイト(または64ビットアーキテクチャでは8)になります。初期値を割り当てると、これらの4バイトが書き込まれ、すぐに上書きすると、8バイトを書き込んだことになります。これがあなたにとって非常に重要な場合は、単に初期値を割り当てないでください。それを使用する前に後でそれを割り当ててください。 –

+0

Nah、それは数バイトが本当に重要なアプリケーションのようなものではありません。私が以前見たことから、obj-cでオブジェクトを適切に割り当て、解放することが重要です。私の例では、私は何も配置していませんでした。変数を割り当て解除するとき、通常は何もしません。だから私の懸念が嘘をついた...私はおそらく、文字列がランダムなポインタを受け取って、別のオブジェクトのポインタを上書きしてクラッシュにつながるかもしれないと思った – BBog

関連する問題