gpt4 book ai didi

ios - 即使在 Reactivecocoa 中加强, self 也变为零

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:08:03 25 4
gpt4 key购买 nike

我想代码本身就说明了一切,所以请看下面的代码。

-(RACSignal *)bossMethod {
@weakify(self)
return [[[self method1] flattenMap:^RACStream *(id value) {
@strongify(self)
return [self method2];
}] flattenMap:^RACStream *(id value) {
@strongify(self)
return [self method3];
}];
}

基本上,我链接信号以逐步执行多个方法。但是方法 3 根本没有被调用。所以我坚持下去,发现在 [self method3] 即将被调用的时候 self 变成了 nil。它是怎么发生的?为什么 @strongify(self) 在这种情况下不起作用?如果有任何建议,我将不胜感激。

最佳答案

self 可能在执行第一个和第二个 flattenMap block 之间设置为 nil(因为最后一个 strong self 对象的引用已被删除)。

一般来说,@strongify 不保证一个变量是非零的。它只保证它不会突然设置为 nil 范围内(在您的情况下,在 flattenMap block 内)。

假设您还没有使用过 @strongify 并且有以下代码:

  @weakify(self)
return [[self method1] flattenMap:^RACStream *(id value) {
[self doSomethingPossiblyLong]; //1
return [self method2]; //2
}];

现在在传递给 flattenMap 的 block 中,您执行两个操作。第一 (1) 个执行一些(可能很长的)计算。第二个 (2) 执行的操作取决于 (1) 的结果。并且您处理多线程代码,因此在这些计算期间(或之后)另一个线程可以启动。

在第二个线程中,可能会删除对您的 self 对象的最后一个强引用。例如,它可能是 UI(主)线程,它可以关闭拥有该对象的 View Controller 。然后 ARC 将完成它的工作,将对该对象的所有弱引用转换为 nil

现在执行回到 flattenMap block ,到这一行:

return [self method2]; //2

但是self变成了nil。之前的计算都白费了,太可惜了。

在这种情况下,使用@strongify 是有意义的。因为您想确保在 flattenMap block 中的代码开始执行后,对 self 的引用(或包装在 @strongify 中的其他变量) macro) 直到 block 的最后才为 nil

请注意,在您发布的代码中,flattenMap 中只有单个方法调用,因此您并没有真正受益于 @strongify。但使用它可能仍然是一个好习惯,所以当您在 block 中添加更多调用 self 的方法时,您不会忘记它。

关于ios - 即使在 Reactivecocoa 中加强, self 也变为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35557724/

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