在objective-c中反转数组中的元素

时间:2011-07-11 22:16:53

标签: iphone objective-c nsarray

NSUInteger是否缺少某些东西。我本来想在我的.m文件中这样做。 (我看到了一些关于使用NSEnumerator的代码,但我并不太了解它,所以我想我的需求,这就足够了。)

所以我想这样做:

- (NSArray *)reverseArray:(NSMutableArray *)array {
    NSMutableArray *anArray = [[NSMutableArray alloc] initWithCapacity:[array count]];
    for (NSUInteger i = [array count] - 1; i >= 0 ; i--) {
        [anArray addObject:[array objectAtIndex:i]];
    }
    return anArray;
}

这给了我编译器警告:i> = 0是NSUInteger的设计目的或沿着这些行的东西。当我运行该程序时,它也会崩溃并访问一些超级巨大的数字。我不太清楚为什么。我可以在任何地方将i偏移1并执行此操作,这样可行:

- (NSArray *)reverseArray:(NSMutableArray *)array {
    NSMutableArray *anArray = [[NSMutableArray alloc] initWithCapacity:[array count]];
    for (NSUInteger i = [array count]; (i) ; i--) {
        [anArray addObject:[array objectAtIndex:i - 1]];
    }
    return anArray;
}

我只是不明白为什么第一种方法不起作用。任何帮助,将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:5)

NSUInteger是一个unsigned整数。因此,如果NSUInteger u=0如果您计算u-1,则不会成为-1。相反,它会下溢并成为一个超级巨大的数字。

将代码更改为

 for (NSInteger i = [array count] - 1; i >= 0 ; i--) {

应该解决问题。

请注意,您实际上不必反转数组。 for-loop

for(a in array){
    ... do something with a ...
}

按正向顺序枚举元素,

for(a in [array reverseObjectEnumerator]){
    ... do something with a ...
}

以相反的顺序枚举元素。

答案 1 :(得分:1)

无符号整数总是> = 0.所以你的第一个循环永远不会终止,最终导致它试图访问objectAtIndex:(NSUInteger)-1,这实际上是一个非常大的正索引,导致崩溃。 / p>

幸运的是,您似乎已经找到了解决问题的方法。干得好。

请注意,Objective-C没有特定的内容;程序员通常使用无符号整数在基本上每种适当的低级语言中犯同样的错误。

答案 2 :(得分:0)

NSUInteger是“无符号”,意味着它不能有 - 表示负数的符号。 在你的代码中......

NSUInteger i = [array count] - 1; i >= 0 ; i--

最终将等于-1,因此错误。 尝试删除=这样的事情。

NSUInteger i = [array count] - 1; i > 0 ; i--