+ [NSString stringWithString:]—ポイントは何ですか?
-
06-07-2019 - |
質問
NScode 文字列は不変なので、 stringWithString:
クラスメソッドの値は何ですか?
NSMutableString
で使用するとユーティリティが表示されますが、 NSString
クラスのユーティリティが表示されませんでした。
解決
複製するNSMutableString(または自家製のNSStringサブクラス)がある場合があります。
NSMutableString *buffer = [NSMutableString string];
// do something with buffer
NSString *immutableStringToKeepAround = [NSString stringWithString:buffer];
もちろん、コピーを作成することもできます:
NSMutableString *buffer = [NSMutableString string];
// do something with buffer
NSString *immutableStringToKeepAround = [[buffer copy] autorelease];
ただし、コピーを所有しているので、それをリリースまたは自動リリースする必要があります。
他のヒント
As" Andy" #318666で指摘しているように、それはメモリ管理に関連し、引用しています:
initWithStringとstringWithStringの違いは、stringWithStringが自動解放されたポインターを返すことです。これは、自動解放プールが自動解放されたポインターをクリーンアップする次回の処理が行われるため、特に解放する必要がないことを意味します。
一方、initWithStringは、保持カウントが1のポインターを返します。そのポインターでreleaseを呼び出す必要があります。そうしないと、メモリリークが発生します。
(こちらから取得)
指定された別の文字列から文字をコピーして作成された文字列を返します
[NSString stringWithString:@"some string"]
これは
と同等です[[[NSString alloc] initWithString:@"some string"] autorelease]
また、NSStringへのポインターがある場合、実際にはNSMutableStringのようなNSStringのサブクラスである可能性があります。したがって、文字列を保存し、変更されないことを保証する場合は、そのコピーを作成する必要があります。したがって、stringWithStringが存在します。
別のユースケースとして、(何らかの理由で)NSStringまたはNSMutableStringの独自のサブクラスを作成する場合、 stringWithString:
は、NSString、NSMutableString、またはMyCustomString。
NSMutableString
を作成する必要があるが、初期値で開始する必要がある場合、よく + stringWithString:
を使用します。例:
NSMutableString * output = [NSMutableString stringWithString:@"<ul>"];
for (NSString * item in anArray) {
[output appendFormat:@"<li>%@</li>", item];
}
[output appendString:@"</ul>"];
FYI、ARCを有効にしてコンパイルしているため、手動でリリースする必要はまったくありません。ARCはコンパイル時にリリース呼び出しを挿入します。それで、それはどう違うのですか? stringWithStringは自動リリースプールに追加されたままであり、将来的にはドレインされます(独自の自動リリースプールを作成していない場合)。 initWithStringは、関数が終了する直前にリリース呼び出しを行うため、メソッド内のどこかにそれを保持しなかった場合、関数呼び出しの終了までに文字列が確実に破棄されます。これにより、自動解放されたオブジェクトを使用するのではなく、メモリ管理をより厳密に制御できます。