-1

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

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

- (ObjectType)objectAtIndex:(NSUInteger)index

但是,我一直发现自己试图遵循这个建议并将我int的 s 更改为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];
            }
        }
    }
}

知道为什么会这样。下图的调试数据中有一个线索,但我无法理解它。

在此处输入图像描述

4

1 回答 1

2

NSUInteger 无符号,因此循环i>=0中的条件始终计算为. 达到 0后,在下一次迭代中,您将得到整数下溢,并变为.forYESiiNSUIntegerMax

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

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

否则,您可以使用类似的东西

if (0 == i) {
    break;
}

在您的循环内或使用do/while例如。

于 2016-09-07T18:58:24.090 回答