由于没有注意到[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+1
和i
处的对象,而且看起来不像适应那种情况。还有其他一些避免这些错误的技巧,而不仅仅是不那么无能吗?
答案 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++) {
...
}