我在某处看到以下三个代码正在做同样的事情。
使用循环:
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);
}];
但我不明白的是 -
答案 0 :(得分:2)
stop
指向的值 - 但就语义而言,除非您使用变量,否则您在其他方法中也不能有任何不同之处具有更广泛的范围,由示例代码指示并在另一个线程上进行操作。idx
和stop
从块的调用上下文传递,用于控制该上下文中的迭代。我的意思是,在enumerateObjectsUsingBlock:
方法的实现中,它像快速枚举方法一样设置本地idx
和stop
,并将它们作为参数传递给块。BOOL
的指针,您可以更改来电者看到的值。也就是说,从您设置*stop
到YES
的块中,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++;
}];