gpt4 book ai didi

objective-c - block 、循环和局部变量

转载 作者:太空狗 更新时间:2023-10-30 03:43:10 25 4
gpt4 key购买 nike

考虑以下代码片段:

for(/* some condition */) {
int x = rand();
[array addObject:^(){
NSLog(@"%d", x);
}]
}

for(void (^block)() in array) {
block();
}

现在我希望这个代码片段打印出在 for 循环中分配给 x 的所有值;然而,似乎所有 block 都共享相同的“x”变量(大概是最后一个)。

知道为什么会这样吗以及我如何修复代码以使每个 block 都包含变量“x”,因为它在定义 block 时是这样的?

最佳答案

文档具体says not to do this .原因是 block 分配在堆栈上,这意味着它们可以超出范围。出于同样的原因,您不能在第一个 for 循环之外访问变量 x,您也不应该使用该 block 。 x 已经超出范围,连同 block 本身,并且可以包含任何值。

要解决这个问题,您可以像这样获取 block 的副本:

for(/* some condition */) {
int x = rand();
void(^logBlock)() = ^() { NSLog(@"%d", x); }
[array addObject:[[logBlock copy] autorelease]];
}

这会将 block 移动到堆上,应该可以解决您的问题。

关于objective-c - block 、循环和局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7750907/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com