質問

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は、関数が終了する直前にリリース呼び出しを行うため、メソッド内のどこかにそれを保持しなかった場合、関数呼び出しの終了までに文字列が確実に破棄されます。これにより、自動解放されたオブジェクトを使用するのではなく、メモリ管理をより厳密に制御できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top