【问题标题】:Better to use NSString or NSMutableString in loop最好在循环中使用 NSString 或 NSMutableString
【发布时间】:2015-01-18 16:32:17
【问题描述】:

对于将字符串数组转换为单个逗号分隔字符串的任务,我想知道下面的 NSString 方法或 NSMutableString 方法是否有显着优势。 (在这两种情况下,allNames 都是NSStringsNSArray。)

NSString 方法

NSString *listOfNames=[allNames objectAtIndex:0];
for (int i=1;i<[allNames count];i++){
   NSString *thisName=[allNames objectAtIndex:i];
   listOfNames=[listOfNames stringByAppendingFormat:@", %@",thisName];
}

NSMutableString 方法

NSMutableString *mutableListOfNames=[[NSMutableString alloc] init];
[mutableListOfNames appendString:allNames[0]];
for (int i=1;i<[allNames count];i++){
    NSString *thisName=[allNames objectAtIndex:i];
    [mutableListOfNames appendFormat:@", %@",thisName];
}
NSString *listOfNames=[NSString stringWithString:mutableListOfNames];

【问题讨论】:

  • 不同之处在于NSString 方法在短时间内创建和释放大量对象。而NSMutableString 避免了这种情况。由于您的程序由 ARC 管理,因此从长远来看,这可能不会产生巨大的影响。
  • 您的字符串结果如下所示是否可以:@", foo, bar" ?
  • 你的所有代码都可以用一行替换:`NSString *listOfNames = [allNames componentsJoinedByString:@", "];
  • @ThomasW:我以为我可以通过在循环之前选择第一个列表项来避免这种情况?运行时似乎按预期工作。
  • @Rogare 使用上面的 NSMutableString 方法,除非 allNames 中的第一个 NSString 是 NSMutableString,否则代码将失败。这也会丢弃最初分配的NSMutableString

标签: ios objective-c nsstring nsmutablestring


【解决方案1】:

是的,NSMutableString 在这种情况下更适合使用。避免了创建大量对象的问题。

【讨论】:

  • 感谢您的回复。这是我一直想知道的:在 NSString 方法中不断“重叠” thisName 的情况下,thisName 的每个后续值是否实际上都被存储(而不是在每次循环迭代后被丢弃)?
  • 此外,它也避免了释放它们,尽管在 ARC 下这可能不是一个大问题。
  • 值得商榷(但也可以衡量)。虽然NSMutableString 的实现实际上是不透明的,但它并不是魔法——如果字符串在增长,分配发生。如果您创建和丢弃一堆不可变的NSStrings,那么这些分配是否“更智能”(即更少),您必须根据经验进行测量才能确定。除非您进行大量繁重/大字符串操作,否则差异在实践中不太重要。
  • 另外,为了记录,ARC 不会阻止对象被释放,它只是自动执行。无论您是显式 (MRR) 还是自动 (ARC),保留和释放对象所导致的任何性能损失都是相同的。
  • 是的。在使用 ARC 的 NSString 方法中,我希望存储在 listOfNames 中的前一个对象在每次循环结束时被释放。我没有明确地测试过它,但根据我对 ARC 的了解(有点),这是我的期望。
猜你喜欢
  • 1970-01-01
  • 2011-01-23
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
相关资源
最近更新 更多