Objective-C中FOR循环的奇怪行为

时间:2014-02-20 15:43:03

标签: ios objective-c arrays for-loop

发现我无法找到解释的情况。

我在objective-c中有一个数组数组。 这种情况下,数组有4个空数组。

NSArray *dados = [[NSArray alloc] initWithObjects:
             [[NSArray alloc] init],
             [[NSArray alloc] init],
             [[NSArray alloc] init],
             [[NSArray alloc] init],
             nil];

如果有两个或更多数字,我希望“for”通过内部数组。

for(int i=0; i<((NSArray *)[dados objectAtIndex:1]).count-1;i++){
        NSLog(@"do anything");
    }

这个“for”进入无限循环 但是,如果我使用“NSLog”告诉我条件是-1,并且“不”应该发生

NSLog(@"%d",((NSArray *)[dados objectAtIndex:1]).count-1);

2014-02-20 15:37:42.563 iKL Time-sheet[31666:a0b] -1

当停止条件为0 <-1时,这个“for”怎么可能变成无限循环?

被认为是一个奇怪的案例,如果有人可以解释什么能够更好地理解我感谢的语言

--------------------- // ----------------
回答:

for(int i=0; i<(int)(((NSArray *)[dados objectAtIndex:1]).count-1);i++){
            NSLog(@"do anything");
        }

这个演员阵容运作良好,对此的解释在于下面的答案

4 个答案:

答案 0 :(得分:9)

count是无符号整数(NSUInteger)。当计数为零时,减去一个包装,产生一个大数。零小于大数。

答案 1 :(得分:2)

你的代码不明显我会用快速迭代重写

NSArray *dados = [[NSArray alloc] initWithObjects:
         [[NSArray alloc] init],
         [[NSArray alloc] init],
         [[NSArray alloc] init],
         [[NSArray alloc] init],
         nil];

for(NSArray * a in dados)
{
    if([a count] >1)
    {
        NSLog(@"do something");
    }
}

编辑:

@synchronized(dados){

    for(int i=0; i<[dados count]);i++){
       if([[dados objectAtIndex:i]count]>1)
       NSLog(@"do anything");
    }
}

因为你的循环不会使它结束......你正在组合两个逻辑上无法组合的测试......除非你的数组首先按元素数排序。

答案 2 :(得分:0)

从计数中删除-1,否则即使数组有多个对象,它也总是跳过最后一个元素

for(int i=0; i<((NSArray *)[dados objectAtIndex:1]).count-1;i++){
        NSLog(@"do anything");
}

答案 3 :(得分:0)

NSArray *dados = @[@[],@[],@[]];

// I want a "for" to go through an internal array
// if it has two or more numbers (skipping the last one)
for( NSUInteger idx = 0;
     (dados[1].count >= 2) && (idx < dados[1].count - 1);
     idx++) 
{
    NSLog(@"do anything");
}