【问题标题】:Reversing elements in an array in objective-c在objective-c中反转数组中的元素
【发布时间】:2011-07-11 22:16:53
【问题描述】:

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;
}

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

【问题讨论】:

标签: iphone objective-c nsarray


【解决方案1】:

NSUInteger 是一个 unsigned 整数。所以,如果NSUInteger u=0 和如果你计算u-1,它不会变成-1。相反,它下溢并成为一个超级庞大的数字。

将代码更改为

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

应该可以解决问题。

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

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

按正序枚举元素,并且

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

以相反的顺序枚举元素。

【讨论】:

    【解决方案2】:

    无符号整数始终 >= 0。因此您的第一个循环永远不会终止,最终导致它尝试访问 objectAtIndex:(NSUInteger)-1,这实际上是一个非常大的正索引,从而导致崩溃。

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

    请注意,Objective-C 对此并没有什么特别之处;程序员在基本上每一种适当的低级语言中都会对无符号整数犯同样的错误。

    【讨论】:

      【解决方案3】:

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

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

      最终将等于 -1,因此会出现错误。 尝试删除 = 类似的东西。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多