0

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

使用循环:

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 声明在块方法中是不寻常的。为什么?(因为我也无法更改块内的值,是因为这样的声明吗?)
4

2 回答 2

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

尝试这个 :

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

[theArray enumerateObjectsUsingBlock:^(id obj){

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

}];
于 2013-03-01T06:37:23.503 回答