菜鸟教程小白 发表于 2022-12-13 14:47:33

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


                                            <p><p>我猜代码本身解释了一切,所以看看下面的代码。</p>

<pre><code>-(RACSignal *)bossMethod {
    @weakify(self)
    return [[ flattenMap:^RACStream *(id value) {
      @strongify(self)
      return ;
    }] flattenMap:^RACStream *(id value) {
      @strongify(self)
      return ;
    }];
}
</code></pre>

<p>基本上,我将信号链接起来以逐步执行多种方法。但是方法 3 根本没有被调用。所以我坚持下去,发现 self 在 <code></code> 即将被调用的时候变成了 nil。它是怎么发生的?为什么 <code>@strongify(self)</code> 在这种情况下不起作用?如有任何建议,我将不胜感激。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p><code>self</code> 可能在第一个和第二个 <code>flattenMap</code>block 执行之间被设置为 <code>nil</code>(因为最后一个 <code>strong </code>对作为 <code>self</code> 的对象的引用已被删除)。 </p>

<p>一般 <code>@strongify</code> 不保证变量不为零。它只保证它不会突然设置为 <code>nil</code> <em>inside</em> 范围(在你的情况下,在 <code>flattenMap</code>block 内)。</p>

<p>假设您没有使用过 <code>@strongify</code> 并且有以下代码:</p>

<pre><code>@weakify(self)
    return [ flattenMap:^RACStream *(id value) {
      ;//1
      return ; //2
    }];
</code></pre>

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

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

<p>现在执行回到 <code>flattenMap</code>block ,到这一行:</p>

<pre><code>return ; //2
</code></pre>

<p>但是<code>self</code>变成了<code>nil</code>。之前所有的计算都是徒劳的,太糟糕了。</p>

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

<p>请注意,在您发布的代码中,<code>flattenMap</code> 内只有单个方法调用,因此您并没有真正从 <code>@strongify</code> 中受益。但是使用它可能仍然是一个好习惯,因此当您在 block 内添加更多调用 <code>self</code> 的方法时,您不会忘记它。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 即使在 Reactivecocoa 中加强,self 也会变为 nil,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/35557724/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/35557724/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 即使在 Reactivecocoa 中加强,self 也会变为 nil