2012-04-23 11 views
0

こんにちは私は情報がNSString値が不変であり、一度値が提供されると変更することはできません。はNSString値は一度値を入力すると変更できませんか?

しかし、私が作成し、次のコードをテストした:

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

をし、これが「こんにちは」最初のSTR値と第2のSTR値として「asdasd」として提供します。そうであれば、NSStringを呼び出すことの妥当性は不変ですか?事前に感謝します。

答えて

10

3行目でやっていることは、新しい文字列を作成し、それをstr変数で指すことです。あなたは元の文字列を変更せず、むしろ変数ポイントを新しいものにしました。

+1

ARCを使用していない場合、元の文字列が漏洩する可能性があります。 – mttrb

+0

@Juan:strの文字列値を変更することが可能な場合、NSString変数が不変として呼び出され、可変文字列と不変文字列の実際の違いは何ですか? –

+0

@mttrbそれは私が私の答えで言っていることです... –

4

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

5

NSString is不変。あなたはそれを突然変異させることはできません。あなたの変数(ポインタ)がconstではないという事実からあなたの混乱が起こります。

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

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

あなたはそのようなポインタのconstと文字列の両方を不変にすることができます。

NSString * const aStr = @"aStr"; 
+1

+1。実際、CoreFoudationでは、CFStringRefは 'struct __CFString * const'として宣言され、NSMutableStringは' struct __CFString * 'として宣言されます。 –

+1

yup - これは、CでCFString型の型指定された多態型宣言をどのようにして実現したかです(ただし、 'const'はポインタではなく' CFStringRef'の場合は* type * __CFString * ') – justin

+0

ええと...アップルの多くの場合、非論理的で過度に複雑なソースコードを見ると、私は泣かせるのです... –

1

使用この意志ゾルあなたの問題...

NSString *str=[NSString stringWithFormat:@"Hello"];  
NSLog(@"\n\nstr = %@",str); 
str = nil; 
[email protected]"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を同等のオブジェクトにすることもできます。

関連する問題