5


3

NSMutableStringとNSStringの両方を持つ目的は何ですか?

Objective CがNSMutableStringを提供するのではなく、クラスNSStringとサブクラスNSMutableStringの両方を提供するのはなぜですか? NSStringは「const NSMutableString」と同等ではありませんか?

C ++では、std

stringというストリングクラスが1つだけあり、定数が必要な場合はconst std:stringを宣言します。

私は、どこでもNSMutableStringを使用するだけで、NSStringに煩わされるべきではない理由を知ることに興味がありますか? 理由がなければ、言語設計者は両方を提供しません。 多分それはより少ないストレージまたは何かを占有しますか?

4 Answer


5


両方のクラスの理由は、std

stringを使用する場合とconst std :: stringを使用する場合がある同じ理由です。 ただし、C ++とは異なり、Objective-Cにはconstメソッドがないため、const-メソッドとnon-const-メソッドを2つの異なるクラスに分けています。 これは、NSArray(NSMutableArray)、NSDictionary(NSMutableDictionary)などの多くのコアクラスでも見られます。


5


文字列が不変である場合にのみ許可される最適化が行われている可能性は非常に高く、おそらくそうです。

実際に実行中

NSString *A = @"Bob";
NSString *B = @"Bob";

デバッガでは、両方が同じ文字列へのポインタであることがすぐに示されます。 実際には

NSString *C = [NSString stringWithString:@"Bob"];
NSString *D = [A copy];

どちらも同じメモリアドレスを指します。 その間

NSString *E = [NSMutableString stringWithString:@"Bob"];

別の文字列を指します。

そのため、場合によってはNSStringsを使用する方が効率的です。 そして一般的に、ココアは編集されたものではなく、文字列の新しいコピーを返すことに役立ちます。 ただし、どこでも変更可能な文字列を使用するべきではないことを私は本当に主張することはできませんが、フレームワークの一般的なガイドラインに反するようです。

私自身の仕事では、物事を直接編集する必要がある可変バリアントのみを使用する傾向があります。 constが必要な場合を除き、すべてが可変であるC / C ++スタイルから少し後方にあり、可変性が必要な場合を除き、すべてがconstです。


0


一般的なルールは、「不要な機能を提供することを目的とするクラスを使用しない」ことです。 文字列の内容を直接変更する必要がある場合は、 `NSMutableString`を使用します。 そうでない場合は、 `NSString`を使用します。 サイズと占有するヒープスペースの点では、クラス自体はかなり似ているはずです。


0


不変の文字列の使用は、変更しないことを知って最適化を実行できるコンパイラのヒントだと思います。