実際に文字列を変更する場合を除いて、を使用しないでくださいNSMutableString
。文字列全体を新しい値に再割り当てするので、通常の。を使用しNSString
ます。自動リリースされたバージョンを使用します。これは、alloc / init/releaseよりも常に効率的であるためです。何に割り当てられるかがわかっている場合は、文字列を定数に再割り当てすることもできます。
最初のケースでは、変数はNSMutableStringである必要があり、NSStringオブジェクトを必要とする関数の引数である必要がある場合は常に、(copyメソッドを使用して)NSStringにキャストする必要があります。そうですか?
まあ、あなたはそれをそのように行うことができますが、それは本当に非効率的です。継承を忘れないでください。anNSMutableString
はNSString
、いくつかの新しいものが追加されただけです。簡単なキャストでうまくいきます。
NSString *string = (NSString *)aMutableString;
さらに良いことに、あなたはそれをする必要さえありません。継承により、通常の文字列が必要な場合はいつでも、キャストを必要とせずに、可変文字列を直接渡すことができます。それが相続の美しさです。
それらを他の定数値に再割り当てするとき、前のコンテンツを破棄する必要はありません。
可変または不変の文字列の場合。古い値は単にメモリに上書きされ、そこで破棄するものはありません。メモリ管理に関する限り、文字通り常に新しい文字列を作成することは実際には効率的ではありません。それらを再割り当てするだけです。alloc
/ init
1つの文字列を複数回使用する必要はありません。その単一の文字列は、単一の文字列init
でバランスを取る必要がありますrelease
。
補遺:いつMutableを使用する必要がありますか?
古い値を完全に破棄せずに、既存の文字列の値を物理的に変更する場合は、可変文字列を使用する必要があります。例としては、最初または最後に文字を追加したり、途中で文字を変更したりすることがあります。可変文字列を使用すると、これを「インプレース」で実行できます。既存の文字列を変更するだけです。対照的に、不変の文字列は、値が設定されると、その値を変更できません。NSString
には、既存の文字列に文字列を追加するなどのメソッドがstringByAppendingString:
ありますが、<strong>新しい文字列を返します。舞台裏では、NSString
古い文字列を新しい(より大きな)メモリ位置にコピーし、引数を追加して、新しい文字列を返しました。そのコピーははるかに効率的ではありません(比較的言えば、またはあなたがそれをたくさんしなければならない場合)。
もちろん、ある文字列を別の文字列に物理的に割り当てることを妨げるものは何もありません。古い値は上書きされます。NSString
を含むほとんどのは@"String Constants"
、自動リリースされます。新しい文字列を作成していて、alloc / initを決定した場合は、結果なしに別の値に割り当てることができます。
myString = anotherString;
myString = myTextField.text;
これは、可変文字列と不変文字列の両方で実行できます。主なポイントは、文字列自体を変更する場合にのみ可変を使用する必要があるということです。ただし、コンパイラやランタイムの問題なしに、可変文字列と不変文字列の両方で変数を変更できます(メモリ管理は不足していますが、ほとんどの場合、とにかく自動解放されます)。