for循环不保存变量中的数据

时间:2012-03-17 03:43:57

标签: objective-c xcode4 for-loop

我正在尝试创建一个字符串(foo2),它将包含fooArray中的所有字符串对象。我不明白为什么下面发布的代码不适合我。

- (void)viewDidLoad
{ 
    [super viewDidLoad];
    NSString *foo =@"This is just a test";
    NSArray *fooArray = [foo componentsSeparatedByString:@" "];

    for(int i=0; i < fooArray.count; i++)
    {
        _foo2= [_foo2 stringByAppendingString:[ fooArray objectAtIndex:i]];
    }

    NSLog(_foo2);
}

2 个答案:

答案 0 :(得分:0)

我猜是因为你没有在_foo2运行之前的任何地方初始化viewDidLoad。由于_foo2尚未初始化并且仍然是一个nil指针,因此每次向其发送stringByAppendingString:消息时,结果仍为零。

您可以通过在循环之前将_foo2初始化为新的NSMutableString对象来解决此问题。

- (void)viewDidLoad
{ 
    [super viewDidLoad];
    NSString *foo =@"This is just a test";
    NSArray *fooArray = [foo componentsSeparatedByString:@" "];

    _foo2 = [[NSMutableString alloc] init];
    for(int i=0; i < fooArray.count; i++)
    {
        _foo2= [_foo2 stringByAppendingString:[ fooArray objectAtIndex:i]];
    }

    NSLog(_foo2);
}

答案 1 :(得分:0)

如果您只想从字符串中删除空格,请考虑:

_foo2 = [foo stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
// or whitespaceAndNewlineCharacterSet, if that fits your use case better

如果你想更具体一点,那就是:

_foo2 = [foo stringByReplacingOccurrencesOfString:@" " withString:@""];

或者更密切地关注你正在做的事情的语义,有:

NSArray *fooArray = [foo componentsSeparatedByString:@" "];
_foo2 = [fooArray componentsJoinedByString:@""];

如果由于某种原因你真的想要遍历它(也许是为了对每个单词进行一些处理?),有几种方法可以做到这一点:

NSArray *fooArray = [foo componentsSeparatedByString:@" "];

_foo2 = [NSMutableString string];
for (int i = 0; i < fooArray.count; i++) {
    [_foo2 appendString:[fooArray objectAtIndex:i]];
}

或者:

NSArray *fooArray = [foo componentsSeparatedByString:@" "];

_foo2 = @""; // equivalent to [NSString string]
for (int i = 0; i < fooArray.count; i++) {
    _foo2 = [_foo2 stringByAppendingString:[fooArray objectAtIndex:i]];
}

(这甚至不考虑快速枚举,也就是for..in构造。)第一个循环可能更有效,因为我想重复追加到相同的NSMutableString比创建新字符串和抛弃旧字符串更便宜我们一起去。