0

こんにちは、NSString 値は不変であり、一度値を指定すると変更できないという情報を受け取りました。

しかし、次のコードを作成してテストしました。

NSString *str=[[NSString alloc] initWithString:@"Hello"];    
NSLog(@"\n\nstr = %@",str);
str=@"asdasd";
NSLog(@"\n\n new str = %@",str);

これにより、「Hello」が最初の str 値として、「asdasd」が 2 番目の str 値として与えられます。もしそうなら、NSStringを不変と呼ぶことの関連性は何ですか?事前に感謝します。

4

4 に答える 4

10

3 行目で行っていることは、新しい文字列を作成し、それを str 変数でポイントしているだけです。元の文字列を変更するのではなく、変数が新しいものを指すようにしました。

于 2012-04-23T04:32:15.230 に答える
5

NSString不変です。変異させることはできません。混乱は、変数 (ポインタ) が ではないという事実から生じますconst

あなたがしているのは、ポインタを別の不変文字列に再割り当てすることだけです。

いずれかに文字列を追加しようとすると、エラーが発生します。これは、具体的には、「… NSString immutable を呼び出すことの関連性」です。宣言した変数が別の NSString インスタンスに割り当てられている可能性があるとしても、文字列インスタンスは変更されない可能性があるため、これを解釈する必要がありますconst

次のように、ポインター const と文字列の両方を不変にすることができます。

NSString * const aStr = @"aStr";
于 2012-04-23T04:35:07.187 に答える
4

不変オブジェクトと定数ポインターを混同しています (さらに、メモリ リークを起こしています)。ここでは、NSStringインスタンス(つまり、オブジェクト自体) を実際に変更するのではなく、それへのポインターを変更するだけです。ポイントは、NSString の異なるインスタンスを同じ変数に割り当てることができ、オブジェクトの内部コンテンツを変更せず、NSMutableString のミューテーション メッセージなどに応答させないことですappendString

于 2012-04-23T04:33:08.340 に答える
1

これを使用すると問題が解決します...

NSString *str=[NSString stringWithFormat:@"Hello"];    
NSLog(@"\n\nstr = %@",str);
str = nil;
str=@"asdasd";
NSLog(@"\n\n new str = %@",str);

あなたが知っておくべきこのいくつかの基本..

NSString *s1 = @"string1";
NSString *s2 = [[NSString alloc] initWithString:@"string2"];
NSString *s3 = [NSString stringWithFormat:@"string3"];

この場合の s1 は、定数文字列へのポインタです。s2 と s3 はどちらも作成した新しい文字列を指していますが、s2 は保持されており、s3 は自動解放されています。一時的なオブジェクトだけが必要な場合は、自動解放されたオブジェクト s3 または定数オブジェクト s1 が適しています。文字列を保持する必要がある場合は、s2 を使用する必要があります (実際、この場合でも s1 が機能することを考えると、実際には慣用的ではありません)。

保持メッセージを送信することで、s1 または s3 を s2 と同等にすることができます。autorelease メッセージを送信して、s2 を同等のオブジェクトにすることもできます。

于 2012-04-23T04:38:36.260 に答える