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

How to Concatenate String in Objective-C (iPhone)?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How do I concatenate strings in Objective-C?

首先,平台是iphone和label.text更改显示的标签。考虑这种情况:

我有一个整数数组。我想把它显示在屏幕上。

这是我的看法:

1
2
3
4
5
6
7
8
-(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,但您正在执行的是[2]=3;这将导致越界错误。


试试这个:

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

  • 这只能在非可变字符串中实现,对吗?我对这些不同的类和它们的方法感到困惑…但是,男人。这正是我需要的。:)
  • AppendString:仅在nsmutableString中,但类似的函数是nsString上的StringByAppendingString:。
  • @Tomdalling:我使用了相同的方法,但是在.h文件中声明了"theString",因为在其中执行追加的委托被多次调用。现在,在这种情况下,我得到一个空的'站'。有什么解决办法吗?


因为你做的是使用一个循环,两个汤姆和benjie小心点的解决方案。他们每个autoreleased创建额外的对象,通过迭代。一个小循环,那很好,但如果是无界的大小环或如果字符串是大,这可以导致a超大内存和性能的扣球命中。特别在iPhone,这是一个小回路完全可以导致记忆问题的好友挤住记忆,由于短的穗状花序。

下面的解决方案有一个较小的内存占用(它是更快和更准确的测试时间少)。注意在调用-appendFormat:-appendString而去。这避免了需要的第二字符串将走了。记住,这是最终的字符串有额外的空间,最后,你可能想摆脱。你可以是任何固定或由第一迭代处理负载或负载在不同的空间,trimming后环。

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

不要忘记[NSArray componentsJoinedByString:]。在这个案例nsarray你不有,但在普通的情况下,你会做,这是最好的方式得到你要找的。


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

另一种方法:使用nsmutablestring

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

这是一个实现(校正的全范围):

1
2
3
4
5
6
7
8
9
10
-(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;
}

所以,你可以做这样的(例如,如果你想要的列表(逗号分隔):

1
2
3
4
5
6
7
8
9
10
11
-(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:@","];
}

  • 虽然我的lisp程序员更喜欢nsstring方法而不是nsmutatablestring,但是您必须小心第一个解决方案对内存的影响。对于这样一个小循环来说,这不是什么大问题,但这是内存中的O(n^2),并且可能会在iPhone上引起问题,即使是短暂的内存峰值也是一个问题。
  • 非常正确。因此,数组方法要好得多。(如果我已经做了[nsmutablearray alloc]和[arr release]…)它还提供了连接字符串的更多灵活性,而不必担心在列表的开头或结尾缺少逗号或空格。