用于控制iOS 5上的数组迭代的变量

时间:2013-03-01 05:11:03

标签: objective-c ios5 ios6 objective-c-blocks

我在某处看到以下三个代码正在做同样的事情。

使用循环:

BOOL stop = 0;
for (int i = 0 ; i < [theArray count] ; i++) {
    NSLog(@"The object at index %d is %@",i,[theArray objectAtIndex:i]);
    if (stop)
        break;
}

使用快速枚举:

int idx = 0;
BOOL stop = 1;

for (id obj in theArray) {
    NSLog(@"fast emuration approch @ x %d is %@",idx,obj);
    if (stop)
        break;
    idx++;
}

使用块:

[theArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){

    NSLog(@"the block approch at x %d is %@",idx,obj);
}];

但我不明白的是 -

  1. 如何在块方法中设置从外部停止?
  2. 如何在块方法中设置idx?
  3. BOOL声明在块方法中是不寻常的。为什么? (因为我也无法更改块内的值,是因为这样的声明吗?)

2 个答案:

答案 0 :(得分:2)

  1. 您只能更改块中stop指向的值 - 但就语义而言,除非您使用变量,否则您在其他方法中也不能有任何不同之处具有更广泛的范围,由示例代码指示并在另一个线程上进行操作。
  2. 你不能。您在块中编写的代码本质上就是循环体,idxstop从块的调用上下文传递,用于控制该上下文中的迭代。我的意思是,在enumerateObjectsUsingBlock:方法的实现中,它像快速枚举方法一样设置本地idxstop,并将它们作为参数传递给块。
  3. 您收到指向BOOL的指针,您可以更改来电者看到的值。也就是说,从您设置*stopYES的块中,enumerateObjectsUsingBlock:的实现会看到其局部变量stop已设置为YES。这是在C中通过引用返回多个参数的典型方法。

答案 1 :(得分:0)

试试这个:

__block bool stop = YES;
__block NSUInteger idx = 0;

[theArray enumerateObjectsUsingBlock:^(id obj){

    NSLog(@"the block approch at x %d is %@",idx,obj);
    idx++;

}];