菜鸟教程小白 发表于 2022-12-12 21:46:10

ios - 使用操作队列保留循环


                                            <p><p>在阅读 <a href="http://www.objc.io/issue-2/common-background-practices.html" rel="noreferrer noopener nofollow">blog about concurrency</a> 时在 iOS 中,我偶然发现了下一个代码:</p>

<pre><code>__weak id weakSelf = self;
[self.operationQueue addOperationWithBlock:^{
    NSNumber* result = findLargestMersennePrime();
    [ addOperationWithBlock:^{
      MyClass* strongSelf = weakSelf;
      strongSelf.textLabel.text = ;
    }];
}];
</code></pre>

<p>作者解释说需要使用weakref是因为:</p>

<blockquote>
<p>we need to make a weak reference to self, otherwise we create a retain
cycle (the block retains self, the private operation queue retains the
block, and self retains the operation queue). Within the block we
convert it back to a strong reference to make sure it doesn’t get
deallocated while running the block.</p>
</blockquote>

<p>我可以理解为什么该 block 会保留自己,但我不明白为什么(以及确切地在哪里)私有(private)操作队列保留了该 block 以及 self 何时/何地保留了操作队列。任何解释将不胜感激。 </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>尝试在没有弱引用的情况下编写此代码:</p>

<pre><code>[self.operationQueue addOperationWithBlock:^{
    NSNumber* result = findLargestMersennePrime();
    [ addOperationWithBlock:^{
      self.textLabel.text = ;
    }];
}];
</code></pre>

<p>为了使这段代码工作 - 编译器在 <code>operationQueue</code> 中保留对 <code>self</code> 的引用,以避免 <code>self</code> 从内存中删除和 <code> 的情况self.textLabel.text = ..</code> 被执行,所以它试图保证对象是活着的。</p>

<p>这是实际创建循环的地方:</p>

<ol>
<li>self 保留 operationQueue(这意味着在 self 活着的时候不能删除 operationQueue)</li>
<li>operationQueue 保留 self(这意味着在 operationQueue 处于事件状态时无法删除 self)</li>
</ol>

<p>为避免这种情况 - 您正在创建周引用,因此您正在消除第二次保留</p>

<p>PS。 “block”是 operationQueue 的一部分,所以我们可以假设这个方案中只有 2 个项目。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 使用操作队列保留循环,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/23149084/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/23149084/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 使用操作队列保留循环