web-dev-qa-db-ja.com

NSMutableStringオブジェクトを初期化する最良の方法は何ですか?

次の質問をすると。 NSMutableStringクラスを初期化する最良の方法は何ですか? (すべてのインスタンスは予期しないときに返されます...したがって、初期化は次のように想定します:)

  1. 仕事量を事前に知っていれば。 (予想)

    NSMutableString *str1 = [NSMutableString stringWithString:@""];
    NSMutableString *str2 = [NSMutableString stringWithCapacity:0];
    NSMutableString *str3 = [NSMutableString stringWithCapacity:1000];
    NSMutableString *str4 = [NSMutableString string];
    
    for(int i = 0; i< 1000; i++)
    {
        //The following tasks.(Adding to the string to continue working.)
        [/*str1~str4*/ appendFormat:@"%d", i];
    }
    
  2. 事前に仕事量がわからない場合。 (予想外)

    NSMutableString *str1 = [NSMutableString stringWithString:@""];
    NSMutableString *str2 = [NSMutableString stringWithCapacity:0];
    NSMutableString *str3 = [NSMutableString stringWithCapacity:1000];
    NSMutableString *str4 = [NSMutableString string];
    
    for(int i = 0; i< /*a large of size(unpredictable)*/ ; i++)
    {
        //The following tasks.(Adding to the string to continue working.)
        [/*str1~str4*/ appendFormat:@"%d", i];
    }
    

これらのタスクを実行するときに大きく2つに分割します。初期化するための最良の方法は何ですか?

これらのタスクを処理するときにも混乱することがあります。

16
bitmapdata.com

ケース1

リストされているオプションのうち、私は次のものを使用します。

NSMutableString *str3 = [NSMutableString stringWithCapacity:1000];

…宛先サイズがわかっている場合、または上部に少し余裕を持って見積もり、正確なサイズ、またはサイズの最悪のシナリオをすばやく判断できる場合は、複数の再割り当ておよびコピー操作を節約できます。最悪のシナリオでサイズがわからない場合、または計算に時間がかかる場合は、[NSMutableString string]または[NSMutableString new]を使用することをお勧めします。また、*WithCapacityはヒントであり、フレームワークはこれを自由に無視できます。

もちろん、ループの本体と予約するサイズは、すべての値が[0…9]であること(具体的には、すべての値が1文字を消費すること)を意味します。その場合、フォーマット文字列を使用することではるかにうまくいく可能性があります。より多くの引数で。ただし、iは、ほとんどの反復で明らかに9より大きく、それぞれ平均3文字を消費するため、投稿した正確なコードには3000がより適切な予約容量になります。

ケース2

リストされているオプションのうち、私は次のものを使用します。

NSMutableString *str4 = [NSMutableString string];

さらに良いことに、自動解放プールに追加する必要がない場合:[NSMutableString new]または[[NSMutableString alloc] init]

その他の注意事項

はい、オブジェクトを自動解放プールから除外する(alloc + initを使用するなど)と、パフォーマンスが向上し、ピークメモリ使用量が大幅に削減されます。これは制御できない場合があり、一部の環境(ARCなど)では、自動リリースされた便利なコンストラクターを使用している場合でも発生する可能性があります。 [NSMutableString string]

より速い解決策

最後に、概説したこのケースが本当にパフォーマンスの問題である場合、最速の方法は、スタックにcharバッファーを作成し、数値をコピーした結果から1つのNSStringを作成することです。 charバッファに。 intsがすべて0〜9であると仮定すると、非常に高速で簡単になり、(終了した)cstringからNSStringを作成するだけです。入力サイズが変化する場合、または非常に大きい場合(結果として非常に長い文字列になる場合)にこれを行うこともできます。

13
justin

それは本当に重要ではありません。

この決定が全体的なパフォーマンスに測定可能な影響を与えるようにプログラムを最適化した場合は、背中を軽くたたくか、BBTのSheldonが言うように「チョコレートを食べてください」と言ってください。

PS:
事前にサイズを正確に知っているか、非常に適切な見積もりがある場合は、そのサイズをstringWithCapacity:またはinitWithCapacity:で使用します。そうでない場合は、気にしないでください。 —フレームワークに決定させてください それはかなり賢いです

10
danyowdee

最短の方法は次のとおりです。

NSMutableString *string = [@"" mutableCopy];
4
Vahan
NSMutableString *str1 = [NSMutableString stringWithString:@""];

悪いことに、NSString(@ "")が無意味に作成され、新しいNSMutable文字列にコピーされます

NSMutableString *str2 = [NSMutableString stringWithCapacity:0];

悪いことに、容量が0のNSMutableStringは、最初に追加するときに膨らませる必要があります。

NSMutableString *str3 = [NSMutableString stringWithCapacity:1000];

1000に何らかの重要性がある場合(つまり、作業しているコンテンツの予想サイズ)、問題ありません。

NSMutableString *str4 = [NSMutableString string];

[NSMutableString alloc] init];を実行するような便利な方法を使用します。