「真のポインタ」を作成しましたが、問題は次のステートメントです。
test2 = @"What the?";
新しい文字列オブジェクトを作成し、新しい文字列へのポインタを変数に割り当てていますtest2
がtest
、古いポインタがまだ含まれています。
この問題を解決するために、ポインターへのポインターを作成できます。または、と変数に新しい値を再割り当てするのではなく、を使用してからNSMutableString
、メソッドのみを使用して文字列を変更(変更)することもできます。NSMutableString
test
test2
以下はNSMutableString
あなたの例のバージョンです:
NSString *test2 = [[NSMutableString alloc] initWithString:@"yo"];
NSString *test = test2;
NSLog(@"test: %@ test2: %@", test, test2);
[test2 setString:@"what the?"];
NSLog(@"test: %@ test2: %@", test, test2);
これは出力を生成します:
2012-11-14 10:06:27.231 Untitled 2[592:707] test: yo test2: yo
2012-11-14 10:06:27.232 Untitled 2[592:707] test: what the? test2: what the?
NSString
■Objective-Cには追加の構文糖衣構文があるため、次の両方が同じ効果を持ちます(ただし、バックグラウンドで発生することは完全に異なるか同じである可能性があります)。
NSString *test = [NSString alloc] initWithString:@"Hello World"];
NSString *test = @"Hello World";
これらのステートメントは両方とも、新しい不変の(変更できない)文字列を作成します。NSString
usingステートメントを作成[NSString alloc] init]
すると、空の文字列が作成されますが、これは通常、実行したいことではありません。
これは、最初の2行が次のような例では次のことを意味します。
NSString*test2=[[NSString alloc]init];
test2=@"yo";
test2
文字列オブジェクトを作成してポインタを配置し、すぐにそのポインタを。によって作成された文字列へのポインタで上書きするため、最初の行は不要です@"yo"
。ARCを使用していない場合、によって作成された文字列[[NSString alloc] init]
が解放されていないため、メモリリークが発生します。ただし、実際にNSString
は他のオブジェクトと同じようには機能しないため、メモリリークを行うよりも、メモリを浪費していると言った方が正しいでしょう。」