gpt4 book ai didi

ios - 为什么像这样使用 dispatch_block_t 不安全?

转载 作者:行者123 更新时间:2023-12-01 16:01:46 25 4
gpt4 key购买 nike

为什么像这样使用 dispatch_block_t 不安全?

我在看dispatch_block_t的官方评论,发现下面的代码,不明白哪里错了?为什么不安全?有人可以告诉我吗?我很感激。希望能详细给我解释一下。

#ifdef __BLOCKS__
/*!
* @typedef dispatch_block_t
*
* @abstract
* The type of blocks submitted to dispatch queues, which take no arguments
* and have no return value.
*
* @discussion
* When not building with Objective-C ARC, a block object allocated on or
* copied to the heap must be released with a -[release] message or the
* Block_release() function.
*
* The declaration of a block literal allocates storage on the stack.
* Therefore, this is an invalid construct:
* <code>
* dispatch_block_t block;
* if (x) {
* block = ^{ printf("true\n"); };
* } else {
* block = ^{ printf("false\n"); };
* }
* block(); // unsafe!!!
* </code>
*
* What is happening behind the scenes:
* <code>
* if (x) {
* struct Block __tmp_1 = ...; // setup details
* block = &__tmp_1;
* } else {
* struct Block __tmp_2 = ...; // setup details
* block = &__tmp_2;
* }
* </code>
*
* 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.
*
* Instead, the block literal must be copied to the heap with the Block_copy()
* function or by sending it a -[copy] message.
*/
typedef void (^dispatch_block_t)(void);
#endif // __BLOCKS__

摘自上述代码:
dispatch_block_t block;
if (x) {
block = ^{ printf("true\n"); };
} else {
block = ^{ printf("false\n"); };
}
block(); // unsafe!!!

我不明白有什么问题?为什么不安全?

最佳答案

这里的文档有点困惑,因为它没有针对 ARC 完全更新。 Under ARC, this is all done for you automatically.

但至于为什么需要它,Objective-C block 最初是在堆栈上分配的。这在立即使用和丢弃它们的情况下提高了性能。如果它们脱离了当前堆栈范围,则需要将它们复制到堆中并像对象一样管理内存。这是使用 Block_copy() 手动完成的(ARC 之前的)。或通过 -copy .见 Blocks Tips & Tricks有关更多信息。

但是您的直觉是正确的;只要您使用 ARC,发布的代码就可以了。如果它是当前 SDK 的一部分,您可能需要打开 Apple 反馈以请求更新此 header 以更加清晰。

关于ios - 为什么像这样使用 dispatch_block_t 不安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57816807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com