【发布时间】:2013-10-05 18:45:18
【问题描述】:
考虑这个简单的例子
int i = 42;
int (^aBlock)() = ^ {
return i;
};
NSLog(@"Class: %@", [aBlock class]);
如果没有 ARC,上面的代码会打印出来
Class: __NSStackBlock__
而使用 ARC 可以打印
Class: __NSMallocBlock__
我在 _Block_copy 上放置了一个符号断点,看起来 ARC 正在插入一个 Block_Copy() 调用,导致块被移动到堆中
这似乎是一个不必要的开销,它首先破坏了将块放在堆栈上的整个目的。
这是 ARC 的限制还是设计选择?
【问题讨论】:
-
对我来说,这看起来像是 Why is this block not global? 的副本,你同意吗? - (我没有发现接受的答案完全令人满意,但也许没有更好的答案,或者它只是一个编译器错误。)
-
感谢您指出这一点,但不,不是真的。这个问题是关于为什么该块没有被编译为全局的,而我想知道为什么 ARC 会插入
Block_Copy()。 -
请注意,我特意通过引用周围范围来确保该块不是全局的。
-
好吧,我不是汇编代码方面的专家,但如果我正确理解了该问题的文本,则会在此处插入一个意外的“块副本”,将全局块移动到堆中。 - 如果将
int i = 42替换为const int i = 42,则会得到一个全局块,这与引用问题的第二个示例中的行为相同。 -
一个全局块已经在堆上,不是吗?无论如何,我明白你的意思,但我仍然相信这与编译器误解的块类型无关。在这种情况下,块类型是已知的(它确实是一个堆栈块,正在被复制到堆中)。问题是:为什么 ARC 复制堆栈块?感谢 Catfish_Man 的评论,我知道在哪里看,我做了功课,并试图在下面回答。让我知道你的想法
标签: objective-c automatic-ref-counting objective-c-blocks