1

プログラム全体で一連の文字列変数を使用する必要があります。私はそれらのいくつかをかなり頻繁に再割り当てしますが、他のものは実行中に同じ値で立ち往生しています。ここでのベストプラクティスは何ですか?

最初のケースでは、変数はである必要があり、オブジェクトを必要とする関数の引数である必要があるときはいつでも、(copyメソッドを使用して)変数NSMutableStringをキャストする必要があります。そうですか?NSStringNSString

それらを他の定数値に再割り当てするとき、前のコンテンツを破棄する必要はありませんよね?

オブジェクトに関しては、新しい値を割り当てる必要がある場合は、NSStringオブジェクトの割り当てを解除し、再度割り当ててから、新しい値を割り当てる必要があると思います。あれは正しいですか?

4

3 に答える 3

6

実際に文字列を変更する場合を除いて、を使用しないでくださいNSMutableString。文字列全体を新しい値に再割り当てするので、通常の。を使用しNSStringます。自動リリースされたバージョンを使用します。これは、alloc / init/releaseよりも常に効率的であるためです。何に割り当てられるかがわかっている場合は、文字列を定数に再割り当てすることもできます。

最初のケースでは、変数はNSMutableStringである必要があり、NSStringオブジェクトを必要とする関数の引数である必要がある場合は常に、(copyメソッドを使用して)NSStringにキャストする必要があります。そうですか?

まあ、あなたはそれをそのように行うことができますが、それは本当に非効率的です。継承を忘れないでください。anNSMutableString NSString、いくつかの新しいものが追加されただけです。簡単なキャストでうまくいきます。

NSString *string = (NSString *)aMutableString;

さらに良いことに、あなたはそれをする必要さえありません。継承により、通常の文字列が必要な場合はいつでも、キャストを必要とせずに、可変文字列を直接渡すことができます。それが相続の美しさです。

それらを他の定数値に再割り当てするとき、前のコンテンツを破棄する必要はありません。

可変または不変の文字列の場合。古い値は単にメモリに上書きされ、そこで破棄するものはありません。メモリ管理に関する限り、文字通り常に新しい文字列を作成することは実際には効率的ではありません。それらを再割り当てするだけです。alloc/ init1つの文字列を複数回使用する必要はありません。その単一の文字列は、単一の文字列initでバランスを取る必要がありますrelease

補遺:いつMutableを使用する必要がありますか? 古い値を完全に破棄せずに、既存の文字列の値を物理的に変更する場合は、可変文字列を使用する必要があります。例としては、最初または最後に文字を追加したり、途中で文字を変更したりすることがあります。可変文字列を使用すると、これを「インプレース」で実行できます。既存の文字列を変更するだけです。対照的に、不変の文字列は、値が設定されると、その値を変更できませNSStringには、既存の文字列に文字列を追加するなどのメソッドがstringByAppendingString:ありますが、<strong>新しい文字列を返します。舞台裏では、NSString古い文字列を新しい(より大きな)メモリ位置にコピーし、引数を追加して、新しい文字列を返しました。そのコピーははるかに効率的ではありません(比較的言えば、またはあなたがそれをたくさんしなければならない場合)。

もちろん、ある文字列を別の文字列に物理的に割り当てることを妨げるものは何もありません。古い値は上書きされます。NSStringを含むほとんどのは@"String Constants"、自動リリースされます。新しい文字列を作成していて、alloc / initを決定した場合は、結果なしに別の値に割り当てることができます。

myString = anotherString;
myString = myTextField.text;

これは、可変文字列と不変文字列の両方で実行できます。主なポイントは、文字列自体を変更する場合にのみ可変を使用する必要があるということです。ただし、コンパイラやランタイムの問題なしに、可変文字列と不変文字列の両方で変数を変更できます(メモリ管理は不足していますが、ほとんどの場合、とにかく自動解放されます)。

于 2011-07-03T22:26:41.867 に答える
1

NSStringオブジェクトに関しては、新しい値を割り当てる必要がある場合は、それらの割り当てを解除し、再度割り当ててから、新しい値を割り当てる必要があると思います。あれは正しいですか?

NSStringを以前に割り当てたことがない場合は、次のように割り当てを解除しません。

NSString *string = [NSString stringWithFormat:@"Hello"];

allocを呼び出すときに、割り当てを解除する必要があるだけです。

NSString *string = [[NSString alloc] initWithString:@"Hello"];
[string release];
于 2011-07-03T22:16:48.463 に答える
1

NSMutableString*とNSString*の唯一の違いは、可変文字列を変更できることです。NSMutableStringはNSStringのサブクラスであるため、何もキャストする必要はありません。また、さまざまなメモリ測定を行う必要もありません(したがって、正しい*)。

文字列の変更可能なバージョンが必要な場合は、

NSMutableString * myMutableString = [NSMutableString stringWithString:myString];

何も「コピー」しないでください。

あなたが呼び出す場合:に注意してください

NSString* myString = myMutableString;

myStringは引き続き変更可能な文字列です。

したがって、何らかの理由(セキュリティ...)で不変の文字列が必要な場合は、

NSString* myString = [NSString stringWithString:myMutableString];

*その通りですが、可変文字列で[replaceCharactersInRange:withString:]を呼び出すこともできます。以前の割り当てから十分なスペースがある場合は、破棄や新しい割り当てを行う必要がないため、より高速になる可能性があります。

(後で追加:setString:メソッドを忘れた)

于 2011-07-03T22:27:35.473 に答える