|
|
1
11
你说Objective-C通过引用阻止捕获是不正确的。它们实际上是按价值捕获的。(除
您遇到的问题是,块从堆栈开始,而堆栈块仅对块表达式的局部作用域有效。在这种情况下,块表达式位于for循环中。这意味着在for循环的迭代结束后,块对象不再有效。但是您将指向该块对象的指针放入数组中。 与for循环中的局部变量一样,堆栈帧中的内存位置随后在循环的下一次迭代中被重新用于堆栈块(在这种情况下会发生这种情况,但这取决于编译器)。因此,如果您检查存储在数组中的值,您会发现所有的对象指针都是相等的。因此,不是有8个指针指向8个块对象,而是有8个指向同一块对象的指针。这就是为什么你认为它是“通过引用”来捕捉它的。但真正发生的是,堆栈上的块在每次迭代时都会被覆盖,因此您的数组包含指向该位置的指针的多个副本,因此您会一次又一次地看到同一个块(上次迭代时创建的块)。 答案是,在将块放入数组之前,您需要复制它。复制的块在堆上并且具有动态生存期(像其他对象一样管理内存)。
您不需要像在JavaScript中那样在Objective-C中包装第二个立即执行的闭包。 |
|
|
2
2
如果你想返回一个块,你需要先复制它,或者发送
|
|
|
Sudheera · 更改页面模板时Wordpress模板不可用 2 年前 |
|
|
NBlackout · Eclipse格式。在打开块的大括号之前删除新行 12 年前 |
|
|
Sherifftwinkie · 使用C中的块 12 年前 |
|
|
Alex · 阻止web服务器上的url(websphere) 13 年前 |
|
|
mrN vbence · Magento重新排列块不起作用 13 年前 |
|
|
zitix · 在Magento中的模型方法中获取前端PHTML模板的输出 13 年前 |