Objective c 堆栈块寿命 int(^b[3])(); 对于(int i=0;i

Objective c 堆栈块寿命 int(^b[3])(); 对于(int i=0;i,objective-c,stack,objective-c-blocks,Objective C,Stack,Objective C Blocks,您的代码显示未定义的行为,因为您使用的块超出了创建它的范围。您应该改为编写以下代码: int (^b[3])(); for (int i=0; i<3; i++) b[i] = ^{ return i;}; for (int i=0; i<3; i++) printf("b %d\n", b[i]()); 变量不会引起问题,因为它实际上是通过添加常量限定符复制到块的作用域中的。您可以通过使用\u block限定符声明变量来授予块对变量的写访问权限,这会产生移动变量(

您的代码显示未定义的行为,因为您使用的块超出了创建它的范围。您应该改为编写以下代码:

int (^b[3])();
for (int i=0; i<3; i++)
    b[i] = ^{ return i;};
for (int i=0; i<3; i++)
    printf("b %d\n", b[i]());

变量不会引起问题,因为它实际上是通过添加常量限定符复制到块的作用域中的。您可以通过使用
\u block
限定符声明变量来授予块对变量的写访问权限,这会产生移动变量(即更改其地址)的奇怪副作用复制引用块时,从堆栈到堆。

我知道块在堆栈中启动,如果不复制到堆,则限制在作用域内。但为什么指针仍然有效?除了块本身,没有涉及指针。变量被复制到块的作用域中。由于不复制块,因此
i
的e副本仍保留在堆栈上,很幸运,在第二个循环中使用它,当它超出范围时,仍然可以工作。相关:
b[i] = [^{ return i; } copy];