gpt4 book ai didi

objective-c - __weak 和 __block 引用有什么区别?

转载 作者:IT老高 更新时间:2023-10-28 11:24:01 25 4
gpt4 key购买 nike

我正在阅读 Xcode 的文档,这让我感到困惑:

__block typeof(self) tmpSelf = self;
[self methodThatTakesABlock:^ {
[tmpSelf doSomething];
}];

以下内容来自文档:

A block forms a strong reference to variables it captures. If you use self within a block, the block forms a strong reference to self, so if self also has a strong reference to the block (which it typically does), a strong reference cycle results. To avoid the cycle, you need to create a weak (or __block) reference to self outside the block, as in the example above.

我不明白“弱(或 __block)”是什么意思?

__block typeof(self) tmpSelf = self;

__weak typeof(self) tmpSelf = self;

这里一模一样?

我在文档中发现了另一篇文章:

Note: In a garbage-collected environment, if you apply both __weak and __block modifiers to a variable, then the block will not ensure that it is kept alive.

所以,我完全感到困惑。

最佳答案

来自关于 __block 的文档

__block variables live in storage that is shared between the lexical scope of the variable and all blocks and block copies declared or created within the variable’s lexical scope. Thus, the storage will survive the destruction of the stack frame if any copies of the blocks declared within the frame survive beyond the end of the frame (for example, by being enqueued somewhere for later execution). Multiple blocks in a given lexical scope can simultaneously use a shared variable.

来自关于 __weak 的文档

__weak specifies a reference that does not keep the referenced object alive. A weak reference is set to nil when there are no strong references to the object.

所以它们在技术上是不同的东西。 __block 是为了阻止你的变量从你的外部作用域复制到你的 block 作用域。 __weak 是一个自定界的弱指针。

注意我说的是技术性的,因为对于你的情况,他们会(几乎)做同样的事情。唯一的区别是您是否使用 ARC。如果您的项目使用 ARC 并且仅适用于 iOS4.3 及更高版本,请使用 __weak。如果全局范围引用以某种方式释放,它确保引用设置为 nil。如果您的项目不使用 ARC 或适用于较旧的操作系统版本,请使用 __block。

这里有一个细微的差别,请确保你理解它。

编辑:另一个难题是__unsafe_unretained。此修饰符与 __weak 几乎相同,但适用于 4.3 之前的运行时环境。但是,它没有设置为 nil,并且可能会给您留下悬垂的指针。

关于objective-c - __weak 和 __block 引用有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11773342/

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