Objective c 块和堆栈

Objective c 块和堆栈,objective-c,objective-c-blocks,Objective C,Objective C Blocks,我知道块是在堆栈中创建的。然而,由于我对堆栈和局部变量没有足够的了解,我无法理解为什么要将块移动到堆中以获得预期的结果。直观地说,我觉得块代码块在堆栈中只有一个实例,这段代码引用局部变量I3次。如果我将它复制到堆中,它将有3个不同的实例,并且在复制过程中,每次它都将捕获3个不同的I值。但我真的很想知道更多关于堆栈、堆和引用局部变量中的块代码 for (int i=0; i<3; i++) b[i] = ^{ return i;}; for (int i=0; i<3; i++

我知道块是在堆栈中创建的。然而,由于我对堆栈和局部变量没有足够的了解,我无法理解为什么要将块移动到堆中以获得预期的结果。直观地说,我觉得块代码块在堆栈中只有一个实例,这段代码引用局部变量
I
3次。如果我将它复制到堆中,它将有3个不同的实例,并且在复制过程中,每次它都将捕获3个不同的
I
值。但我真的很想知道更多关于堆栈、堆和引用局部变量中的块代码

for (int i=0; i<3; i++)
    b[i] = ^{ return i;};
for (int i=0; i<3; i++)
    printf("b %d\n", b[i]());
for(inti=0;i作用域,man.Scopes

改写为:

void georgeClinton() {
    int (^b[3])(); // iirc
    // georgeClinton's scope
    for (int i=0; i<3; i++) {
        // for's scope
        b[i] = ^{ return i;};
    }
}
void georgeClinton(){
int(^b[3])();//iirc
//乔治·克林顿的视野

对于(int i=0;iIt看起来你从bbum的文章中得到了那个片段,并且你已经非常准确地描述了正在发生的事情。你能更具体地描述一下你缺少了哪些部分吗?你是对的,我只是在读这篇文章,但它没有描述细节。缺少的部分首先是为了确认我的理解。其次是取消rstand
code
如何适合堆栈?我认为只有数据可以适合堆栈。我可以在堆栈中复制块本身,然后我可能不需要将其移动到堆中吗?
georgeClinton
的第一行应该是
int(^b[3]);
,因为块返回值。谢谢;修复了。因此需要编译器来解答。:)@我知道块代码的引用驻留在堆栈上。不可变代码本身也驻留在堆栈上或其他任何地方?当你说“它们从堆栈开始”时,你是说块结构从堆栈开始,还是对块结构的引用从堆栈开始?@bbum:不确定你是否会注意到这个评论,但我很好奇,如果块结构被破坏了3次,为什么b[]块数组元素都包含最后一个块及其捕获的
i
状态
2
。我希望数组中的所有元素都是指向堆栈的无效指针,因为它们在循环后都被销毁。这只是巧合;当for()的作用域循环已被销毁。数组不包含块,它包含对for()循环中堆栈上现已失效的块槽的引用。如果要使用优化(或使用GC的clear stack func)编译它,您可能会看到不同的[未定义]行为。