NSUInteger 与 for 循环的奇怪之处

NSUInteger oddities with for loops

我使用 AppCode 调整我在 XCode 中编写的代码。 AppCode 进行了很棒的代码检查,并告诉您可以改进的地方。

我遇到的一个经常检查指出 [SomeObjCFrameworkClass objectAtIndex] 期待一个 NSUInteger 实际上是真的...

- (ObjectType)objectAtIndex:(NSUInteger)index

然而,我总是发现自己在试图遵循这个建议并将我的 ints 更改为 NSUIntegers 时被搞砸了。

例如,这是我进行此更改时爆炸的一段代码...

-(void)removeBadge
{
    if ([[theButton subviews] count]>0)
    {
        NSUInteger initalValue = [[theButton subviews] count]-1;
        //Get reference to the subview, and if it's a badge, remove it from it's parent (the button)
        for (NSUInteger i=initalValue; i>=0; i--) {

            if ([[[theButton subviews] objectAtIndex:i] isMemberOfClass:[MKNumberBadgeView class]])
            {
                [[[theButton subviews] objectAtIndex:i] removeFromSuperview];
                [theButton setTitleColor:[UIColor lightTextColor] forState:UIControlStateNormal];
            }
        }
    }
}

知道为什么会这样。 下图的debug数据有一点线索,但我看不懂。

NSUInteger 是无符号的,因此 i>=0 循环中的 for 条件总是计算为 YES。在 i 达到 0 后,在下一次迭代中你将得到整数下溢,并且 i 变为 NSUIntegerMax.

更新:据我从您的代码中可以看出,没有理由以相反的顺序处理子视图。所以,你可以简单地做

for (NSUInteger i=0; i<theButton.subviews.count; i++)

否则,你可以使用类似

的东西
if (0 == i) {
    break;
}

在你的循环中或使用 do/while 例如。