gpt4 book ai didi

objective-c - 在 Objective-C 中,将 block 中的弱点分配给强点是什么意思?

转载 作者:太空狗 更新时间:2023-10-30 03:47:45 24 4
gpt4 key购买 nike

在 Objective-C 中,在 block 中将 weak 分配给 strong 是什么意思?幕后发生了什么?

例如

__weak __typeof(self) wself = self;

void (^cmd)() = ^(){
__strong __typeof(self) sself = wself;
if (!sself) return;
...
};

最佳答案

这里的意图有两个:

  1. 首先是使用:

    __weak __typeof(self) wself = self;

    这确保了 cmd block 不会维护对 self 的强引用。这确保如果 cmd 是该类的实例变量,您不会以强引用循环结束。如果您不使用此 wself 模式,则永远不会释放具有 cmd 作为实例变量的类,并且您会泄漏具有 cmd 的对象 作为一个实例变量。

    有关详细信息,请参阅 Avoid Strong Reference Cycles when Capturing self 使用 Objective-C 编程:使用 block 文档的部分。

  2. 其次,在 block 内使用以下内容:

    __strong __typeof(self) sself = wself;
    if (!sself) return;

    这确保了,如果 block 开始执行,如果 wself 已经被释放, block 将退出。但是,如果 wself 尚未被释放,则通过分配 sself,您可以确保该对象将在 block 执行期间保留。

    此外,如果您在 block 中引用任何 ivar,请注意您想要取消引用它们(否则在 block 中存在对 self 的隐式引用,可能导致强引用循环).但是你不能使用弱指针取消引用 ivars(例如 wself->someIvar 是不允许的),但是你可以使用这个本地强指针(例如 sself->someIvar 是可以的).通常,您无论如何都不应该取消引用 ivar,而应该使用属性,但尽管如此,这是对 self 使用本地强引用的另一个原因。

通常,您会看到此构造与类属性(或 ivar)结合使用:

@property (nonatomic, copy) void (^commandBlock)(void);

而且,按照惯例,您通常会看到更具描述性的变量名称,weakSelfstrongSelf,因此:

__weak __typeof(self) weakSelf = self;

self.commandBlock = ^(){
__strong __typeof(self) strongSelf = weakSelf;
if (!strongSelf) return;
...
};

这种 weakSelf/strongSelf 模式在您拥有自己的类 block 属性并且您想要 (a) 防止强引用循环(也称为保留循环)时非常常见);但是 (b) 想要确保所讨论的对象不会在 block 执行过程中被释放。

关于objective-c - 在 Objective-C 中,将 block 中的弱点分配给强点是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20616788/

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