【发布时间】:2011-09-16 01:36:10
【问题描述】:
在libdispatch、queue.h 的 Apple 头文件之一中,出现以下警告:
// The declaration of a block allocates storage on the stack.
// Therefore, this is an invalid construct:
dispatch_block_t block;
if (x) {
block = ^{ printf("true\n"); };
} else {
block = ^{ printf("false\n"); };
}
block(); // unsafe!!!
// What is happening behind the scenes:
if (x) {
struct Block __tmp_1 = ...; // setup details
block = &__tmp_1;
} else {
struct Block __tmp_2 = ...; // setup details
block = &__tmp_2;
}
// As the example demonstrates, the address of a stack variable is
// escaping the scope in which it is allocated. That is a classic C bug.
尽我所能,我想不出一个可以说明这个错误的测试用例。我可以创建在堆栈上实例化的块,但它们(似乎)总是出现在堆栈上的唯一地址处,即使彼此超出范围也是如此。
我想这个问题的答案很简单,但它让我无法理解。谁能填补我(有限)理解中的空白?
编辑:我看到了this 的回复,但我不太明白该实例如何转化为我上面发布的示例。有人可以给我看一个使用if 构造的例子吗?
【问题讨论】:
-
您发布的链接与另一个问题有关,即在存在可变变量的情况下,闭包似乎表现得很奇怪。请参阅问题"Javascript: closure of loop?",这与 JavaScript 中的问题完全相同。然而,他们似乎犯了这个评论所警告的错误。这些天块会自动复制自己吗?我也想知道。
-
我尝试了一点,但总是得到和你一样的结果,块结构似乎在函数范围内。也许很多人被咬了,他们就这样改变了?
标签: c objective-c-blocks grand-central-dispatch