来自[NSArray count]的常量错误是无符号的

时间:2014-01-31 11:39:47

标签: objective-c for-loop int nsarray

由于没有注意到[NSArray count]为unsigned的后果,我一遍又一遍地制造错误。今天的例子相对不寻常:

for (int i = -1; i < [myArray count]; i++) {

这个循环永远不会执行!您需要(int)[myArray count]。我通常的错误是:

for (int i = 0; i < [myArray count] - 1; i++) {

如果数组为空,则此循环基本上永远执行,因为[myArray count]-1溢出unsigned int

我尽可能使用快速枚举,但是在这个项目中我经常需要在处理对象i-1时引用索引i+1i处的对象,而且看起来不像适应那种情况。还有其他一些避免这些错误的技巧,而不仅仅是不那么无能吗?

4 个答案:

答案 0 :(得分:5)

首先,有一个警告你可以打开来解决这些问题。我认为这是“符号比较”,命令行标志是-Wsign-compare

如果你想迭代一个数组的元素,但你需要索引,那么最好的方式(在我看来)是-enumerateObjectsUsingBlock:

[myArray enumerateObjectsUsingBlock: ^(id obj, NSUInteger idx, BOOL *stop) 
{
    NSlog(@"Object at index %lu is %@", (unsigned long) idx, obj);
    if (idx > 0)
    {
        NSlog(@"Previous object is %@", [myArray objectAtIndex: idx - 1]);
    }
    if (idx + 1 < [myArray count])
    {
        NSlog(@"Next object is %@", [myArray objectAtIndex: idx + 1]);
    }
}];

答案 1 :(得分:2)

在执行快速枚举时仍然可以使用索引,只需执行:

for (id object in myArray)
{
    NSInteger anIndex=[myArray indexOfObject:object];
}

答案 2 :(得分:0)

根据我的建议, 你可以和Antonio MG一起回答

你想要循环,然后尝试下面的代码

   int totalObj = myArray.count-1;
for (int i = 0; i<totalObj; i++) {
    // Write your code
}

答案 3 :(得分:-1)

JeremyP的答案是最好的。如果由于某种原因你不想使用快速枚举来运行for循环,一个建议就是学会使用无符号整数作为索引。

for (NSUInteger i = 0; i < something.count; i++) {
    ...
}