在Objective-C中,通过块捕获变量的语义是什么?
相反,它会打印出:
#import <Foundation/Foundation.h>
#include <stdio.h>
int main()
{
NSMutableArray *arr = [NSMutableArray array];
for (int i = 0; i < 100; ++i) {
int j = i;
[arr addObject:^(void) {printf("%d %d\n", i, j); }];
}
for (void (^blk)(void) in arr) {
blk();
}
}
我期望它可以打印出类似这样的内容:
100 0
100 1
...
100 99
相反,它会打印出:
99 99
99 99
...
99 99
它是如何将j
解释为等于99
的呢?j
在for循环之外甚至不存在。
0 0
,1 1
,...99 99
。 - rmaddyfor
循环内部,记录blk
的地址。实际上,您可能在数组中重复100次拥有同一个块,并且它们全部引用捕获循环最后值的最后一个块。 - rmaddy