如何在Objective-C (iPhone)中连接字符串?

22

可能是重复问题:
如何在Objective-C中连接字符串?

首先,该平台是iPhone,label.text会更改所显示的标签。考虑以下情况:

我有一个整数数组,想要将其显示在屏幕上。

这是我的处理方式:

-(IBAction) updateText: (id)sender {
   int a[2];
   a[0]=1;
   a[1]=2;
   a[2]=3;
   for (int i=0; i<=10;i++)
     label.text = [NSString stringByAppendingString: [NSString stringWithFormat: @"%i", a[i]]]; 
}

你可能已经看到,我很困惑。拜托了,请帮帮我 :(


有点晚了,但是你用大小为2来初始化数组,所以最高索引应该是1,但是你却写 a[2] = 3; 这会导致越界错误。 - Jonny
4个回答

36

试试这个:

NSMutableString* theString = [NSMutableString string];
for (int i=0; i<=10;i++){
    [theString appendString:[NSString stringWithFormat:@"%i ",i]];
}
label.text = theString;

这只有在NSMutableString中才能实现,对吧?我被所有这些不同的类和它们的方法搞混了……但是,感谢你啊。这正是我需要的。 :) - r0ach
appendString: 只适用于 NSMutableString,但 NSString 上有一个类似的函数 stringByAppendingString:。 - Tom Dalling
1
@TomDalling:我使用了相同的方法,但是由于要多次调用执行附加操作的委托,因此在.h文件中声明了'theString'。但是,在这种情况下,我得到了一个空的'theString'。有任何修复方法吗? - Jayprakash Dubey

17

由于您正在使用循环,因此请注意Tom和Benjie的解决方案都会在每次迭代中创建一个额外的自动释放对象。对于小循环来说,这是可以接受的,但如果循环的大小是未限定的或者字符串很大,这可能会导致非常大的内存峰值和性能损失。特别是在iPhone上,这正是可能导致短暂内存峰值引起意外内存问题的那种循环。

下面的解决方案具有更小的内存占用(它也稍微快一些,输入较少)。请注意调用-appendFormat:而不是-appendString。这样避免了创建将被丢弃的第二个字符串。请记住,最终字符串末尾有一个额外的空格,您可能希望摆脱它。您可以通过在第一次或最后一次迭代时对待其进行修复,或者在循环结束后删除最后一个空格来解决该问题。

NSMutableString* theString = [NSMutableString string];
for (int i=0; i<=10;i++){
    [theString appendFormat:@"%i ",i];
}
label.text = theString;

别忘了[NSArray componentsJoinedByString:]方法。虽然在这种情况下你没有一个NSArray对象,但是在通常情况下,如果你有的话,这可能是获取你想要的最佳方式。


7
//NSArray *chunks   
string = [chunks componentsJoinedByString: @","];

4

不使用NSMutableString的另一种方法:

NSString* theString = @"";
for (int i=0; i<=10;i++){
    theString = [theString stringByAppendingFormat:@"%i ",i];
}
label.text = theString;

这是一个完整的实现(修正了您的范围):
-(IBAction) updateText: (id)sender {
     int a[3];
     a[0]=1;
     a[1]=2;
     a[2]=3;
     NSString *str = @"";
     for (int i=0; i<3;i++)
       str = [str stringByAppendingFormat:@"%i ",i];
     label.text = str;
}

你也可以这样做(例如,如果你想要一个逗号分隔的列表):
-(IBAction) updateText: (id)sender {
     int a[3];
     a[0]=1;
     a[1]=2;
     a[2]=3;
     NSMutableArray *arr = [NSMutableArray arrayWithCapacity:3];
     for (int i=0; i<3;i++)
         [arr addObject:[NSString stringWithFormat:@"%i",i]];

     label.text = [arr componentsJoinedByString:@", "];
}

1
虽然我内心深处的LISP程序员更喜欢NSString方法而非NSMutableString,但你必须小心第一种解决方案对内存的影响。对于这样一个小循环来说,这并不是什么大问题,但在内存上它是O(n^2)的,可能会在iPhone上引起问题,因为即使是短暂的内存峰值也会成为一个问题。 - Rob Napier
非常正确。出于这个原因,数组方法要好得多。(如果我做了[NSMutableArray alloc]和[arr release],它会更好...)它还提供了额外的灵活性,在连接字符串时无需担心列表开头或结尾缺少逗号或空格。 - Benjie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接