菜鸟教程小白 发表于 2022-12-13 14:18:50

ios - 在 ARC 中,子对象如何告诉父对象我完成了,请释放我(以避免内存泄漏)


                                            <p><p>我的父对象创建一个子对象来执行一些异步操作。它涉及一些用户交互,这也是我没有使用 <code>NSOperation</code> 的原因之一。只有子对象知道它什么时候完成了它的任务,那么它怎么告诉它的父对象我已经完成了,请释放我以避免内存泄漏?</p>

<p>目前想出这个,父对象有个回调方法叫<code>releaseChild</code>,就是<code>child = nil</code>;当子对象完成其任务时,它调用父对象的 <code>releaseChild</code> 只是为了将自己设置为 nil。实际上,我将调用包装在 <code>dispatch_after</code> 中,但想法是一样的,子对象调用其父对象将自己设置为 nil。</p>

<p>我想知道有没有更好的方法?</p>

<p>-----更新-----</p>

<p>我知道写我 child 的“正常”方式是创建一个 <code>UIViewController</code> 对象,将其推送到 <code>UINavigationController</code>。完成后用户可以弹出它,<code>ARC</code> 将释放它。这样,我不需要担心内存泄漏(通常)。但我认为当子对象完成时释放子对象的问题,只有它知道何时完成有一个边框应用程序而不是编写一个 <code>UIViewController</code> 对象。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>在问题中:</p>

<blockquote>
<p>Only the child object knows when it has finished its task, then how does it tell its parent object that I am done, please release me to avoid memory leaks?</p>
</blockquote>

<p>在后面的评论中:</p>

<blockquote>
<p>the problem is the child object can&#39;t set itself to nil.</p>
</blockquote>

<p>看起来你需要的是一个控制自己生命周期的子对象。这很容易做到;只要一个对象的引用存储在一个变量中,它就保持事件状态,该变量被认为是对存储在其中的引用的强所有权——并且该属性是变量声明的默认值。那个变量可以是全局的、局部的、实例的,没关系……所以要控制自己的命运,对象只需要保持对自身的引用即可。</p>

<p>以下代码,复制自 <a href="https://stackoverflow.com/questions/10489995/manual-object-lifetime-with-arc/10490861#10490861" rel="noreferrer noopener nofollow">Manual object lifetime with ARC</a> (我几年前写的一个先前的答案,我可以从我自己那里婴儿床;-)),显示了一种方法:</p>

<pre><code>@implementation MasterOfMyOwnDestiny
{
   MasterOfMyOwnDestiny *alsoMe;
}

- (void) lifeIsGood
{
    alsoMe = self;
}

- (void) woeIsMe
{
    alsoMe = nil;
}

...

@end
</code></pre>

<p>在您的情况下,您可以让 child 在其初始化期间设置 <code>alsoMe</code>,因此 child 开始控制自己的生命周期。当 child 决定它已经完成它的工作时,它只是调用 <code></code> 作为它的 <em>final</em>Action 。</p>

<p>注意:您当然可以删除方法并直接在子对象中设置实例变量,这样任何其他对象都很难杀死子对象。</p>

<p>如果父级出于任何原因需要对子级的引用,而不是让子级保持事件状态,那么它可以将该引用存储在一个变量中,该变量归因于断言存储在其中的引用的弱所有权,例如类似:</p>

<pre><code>__weak MasterOfMyOwnDestiny *myChild = ;
</code></pre>

<p>这样的引用不会使 <code>myChild</code> 引用的对象保持事件状态,并且会在该对象死亡时自动设置为 <code>nil</code>。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在 ARC 中,子对象如何告诉父对象我完成了,请释放我(以避免内存泄漏),我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/40168260/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/40168260/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在 ARC 中,子对象如何告诉父对象我完成了,请释放我(以避免内存泄漏)