NSUInteger 与 for 循环的奇怪之处
NSUInteger oddities with for loops
我使用 AppCode 调整我在 XCode 中编写的代码。 AppCode 进行了很棒的代码检查,并告诉您可以改进的地方。
我遇到的一个经常检查指出 [SomeObjCFrameworkClass objectAtIndex]
期待一个 NSUInteger
实际上是真的...
- (ObjectType)objectAtIndex:(NSUInteger)index
然而,我总是发现自己在试图遵循这个建议并将我的 int
s 更改为 NSUInteger
s 时被搞砸了。
例如,这是我进行此更改时爆炸的一段代码...
-(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
例如。
我使用 AppCode 调整我在 XCode 中编写的代码。 AppCode 进行了很棒的代码检查,并告诉您可以改进的地方。
我遇到的一个经常检查指出 [SomeObjCFrameworkClass objectAtIndex]
期待一个 NSUInteger
实际上是真的...
- (ObjectType)objectAtIndex:(NSUInteger)index
然而,我总是发现自己在试图遵循这个建议并将我的 int
s 更改为 NSUInteger
s 时被搞砸了。
例如,这是我进行此更改时爆炸的一段代码...
-(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
例如。