NSString不変はその値を変更できますか?
-
05-07-2019 - |
質問
以下のコードはコンパイルおよび実行されますが、すべてのiPhone開発ブックおよびAppleのドキュメントに従ってください。不変のNSStringが設定された後にその値を変更する方法を教えてください。同じ文字列変数のコンテキストを変更するには、NSMuttableStringを使用する必要があると思いましたか? SDK 3.1を使用しています。
NSString *test =[[NSString alloc] initWithString:@"TEST"];
[test release];
test = @"TEST2";
解決
おそらく次の例は、MarkとNielsからの返信を追加し、物事を明確にするのに役立ちます。
不変の文字列
// Setup two variables to point to the same string
NSString * str1 = @"Hello World";
NSString * str2 = str1;
// "Replace" the second string
str2 = @"Hello ikilimnik";
// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);
変更可能な文字列
// Setup two variables to point to the same string
NSMutableString * str1 = [NSMutableString stringWithString:@"Hello World"];
NSMutableString * str2 = str1;
// "Replace" the second string
[str2 setString:@"Hello ikilimnik"];
// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);
不変のNSStringクラスを使用する場合は、「置換」する唯一の方法であることに注意してください。文字列とは、新しい文字列を作成して変数" str2"を更新することです。それを指すように。ただし、これは" str1"には影響しません。が指しているため、元の文字列を引き続き参照します。
NSMutableStringの例では、2番目の文字列を作成せずに、既存の「Hello World」の内容を変更(変更)します。文字列。両方の変数が引き続き同じ文字列オブジェクトを指しているため、NSLogの呼び出しで新しい値が報告されます。
ポインタ変数とそれが指す実際のオブジェクトを区別することが重要です。 NSStringオブジェクトは不変ですが、文字列を指す変数の値を変更することを妨げるものではありません。
データ型" NSString *"オブジェクト自体ではなく、NSStringオブジェクトへのポインタです。 XCodeデバッガー内のNSLogステートメントのいずれかにブレークポイントを設定する場合、各変数の生の値を確認してこれを明確にすることができます。
他のヒント
文字列を変更するのではなく、変数testを別の文字列を指すように再割り当てするだけです。元の文字列は変更されていません。
TESTとTEST2は、* testポインターが指す2つの異なる文字列です。
明示的に割り当てられたNSStringオブジェクトの内容をコードの最初の行から変更するのではなく、* testを別のオブジェクトに向けます。