初始化NSMutableString对象的最佳方法是什么?

时间:2011-12-26 15:23:54

标签: iphone objective-c nsstring 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];
    }
    
  3. 执行这些任务时大致分成两部分,初始化的最佳方法是什么?

    我有时在处理这些任务时也会感到困惑。

6 个答案:

答案 0 :(得分:13)

案例1

在列出的选项中,我使用:

NSMutableString *str3 = [NSMutableString stringWithCapacity:1000];

...如果您知道目的地大小,或者在顶部有一个小房间估算它,并且能够快速确定确切的大小,或者最坏情况下的大小,这可以节省多个重新分配和复制操作。如果您在最坏的情况下不知道大小,或者计算时需要花费大量时间,那么您也可以使用[NSMutableString string][NSMutableString new]。此外,*WithCapacity是一个提示,框架可以自由忽略。

当然,你的循环体和你预留的大小也意味着所有的值都是[0 ... 9](具体来说,所有的值都消耗一个字符),在这种情况下,你可以做得更好使用带有更多参数的格式字符串但是,对于大多数迭代,i显然大于9,并且每个迭代平均消耗3个字符,因此对于您发布的确切代码,3000将是更合适的预留容量。

案例2

在列出的选项中,我使用:

NSMutableString *str4 = [NSMutableString string];

更好的是,如果您不需要将其添加到自动释放池:[NSMutableString new][[NSMutableString alloc] init]

其他笔记

是的,将对象保留在自动释放池之外(例如,使用alloc + init)可以显着提高性能并降低峰值内存使用量。有时,这超出了您的控制范围,在某些环境(例如ARC)中,即使您使用自动释放的便利构造函数,也可能会发生这种情况,例如: [NSMutableString string]

更快的解决方案

最后,如果你概述的这种情况确实是一个性能问题,最快的方法是在堆栈上创建一个char缓冲区,然后从复制数字的结果中创建一个NSStringchar缓冲区。假设你的int都是0-9,它将非常快速和简单,然后只需从(终止的)cstring创建一个NSString。如果输入大小变化,或者非常大(导致字符串很长),您甚至可以这样做。

答案 1 :(得分:10)

这并不重要。

如果你已经对你的程序进行了优化,以至于这个决定会对其整体表现产生可测量的影响,那就拍拍自己,或者像BBT的Sheldon所说的那样,“吃巧克力!”

PS:
如果你准确地知道前面的大小或对它有一个非常好的估计,那么在stringWithCapacity:initWithCapacity:中使用该大小,如果你不这样做,那么甚至不要打扰 - 让框架决定,it's pretty damn clever

答案 2 :(得分:3)

这是最简短的方法:

NSMutableString *string = [@"" mutableCopy];

答案 3 :(得分:1)

NSMutableString *str1 = [NSMutableString stringWithString:@""];

糟糕,NSString(@&#34;&#34;)被毫无意义地创建,然后被复制到新的NSMutable String

NSMutableString *str2 = [NSMutableString stringWithCapacity:0];

不好,一个容量为0的NSMutableString需要在第一次添加时膨胀。

NSMutableString *str3 = [NSMutableString stringWithCapacity:1000];

好,如果1000具有一定的意义(即它是您正在使用的内容的预期大小)。

NSMutableString *str4 = [NSMutableString string];

很好,使用便捷方法,就像做[NSMutableString alloc] init];

一样

答案 4 :(得分:0)

如果您事先知道尺寸,请使用

 [NSMutableString stringWithCapacity: _Known_Size_];

如果您事先不知道尺寸,请使用

 [NSMutableString stringWithCapacity: _small_number_];

然后可变字符串将根据需要增长。

答案 5 :(得分:-2)

分配和初始化对象总是更好,而不是使用类方法来创建它(将它放在最近的自动释放池中)。

所以,

NSMutableString* stringOne = [[NSMutableString alloc] initWithCapacity:capacity];

而不是

NSMutableString* stringTwo = [NSMutableString stringWithCapacity:capacity];

请记住,完成后必须释放stringOne,而不是stringTwo,因为stringWithCapacity:class方法返回一个自动释放的对象。

在此处详细了解该主题:http://www.mulle-kybernetik.com/artikel/Optimization/opti-5.html