我的父对象创建一个子对象来执行一些异步操作。它涉及一些用户交互,这也是我没有使用 NSOperation 的原因之一。只有子对象知道它什么时候完成了它的任务,那么它如何告诉它的父对象我完成了,请释放我以避免内存泄漏?
目前,我想出了这个,父对象有一个名为 releaseChild
的回调方法,它只是 child = nil
;当子对象完成其任务时,它会调用父对象的releaseChild,只是将其自身设置为nil。实际上,我将调用包装在 dispatch_after
中,但想法是相同的,子对象调用其父对象将其自身设置为 nil。
我想知道有没有更好的方法?
-----更新-----
我知道编写我的 child 的“正常”方法是创建一个 UIViewController
对象,将其推送到 UINavigationController
。当它完成后,用户可以弹出它,ARC
然后将其释放。这样,我就不需要担心内存泄漏(通常)。但我认为在完成时释放子对象并且只有它知道何时完成的问题具有边框应用程序而不是编写 UIViewController
对象。
最佳答案
在问题中:
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?
并在稍后的评论中:
the problem is the child object can't set itself to nil.
看来您需要的是一个控制其自身生命周期的子对象。这很容易做到;只要变量中存储了对它的引用,该对象就保持事件状态,该变量归因于对存储在其中的引用断言强所有权 - 并且该属性是变量声明的默认值。该变量可以是全局的、局部的、实例的,这并不重要......因此,要控制自己的命运,对象只需要保留对自身的引用。
以下代码,复制自 Manual object lifetime with ARC (我几年前写的上一个答案,我可以抄袭自己;-)),展示了一种方法:
@implementation MasterOfMyOwnDestiny
{
MasterOfMyOwnDestiny *alsoMe;
}
- (void) lifeIsGood
{
alsoMe = self;
}
- (void) woeIsMe
{
alsoMe = nil;
}
...
@end
在您的情况下,您可以在子进程初始化期间设置alsoMe
,这样子进程就开始控制自己的生命周期。当子进程决定完成其工作时,它只需调用 [self woeIsMe]
作为其最终操作。
注意:您当然可以删除方法并直接在子对象中设置实例变量,这样任何其他对象都很难杀死子对象。
如果父级出于任何原因需要拥有对子级的引用,而不是为了让子级保持事件状态,那么它可以将该引用存储在一个变量中,该变量归因于断言存储在其中的引用的弱所有权,例如像这样:
__weak MasterOfMyOwnDestiny *myChild = [MasterOfMyOwnDestiny new];
这样的引用不会使myChild
引用的对象保持事件状态,并且当该对象死亡时将自动设置为nil
。
关于ios - 在ARC中,子对象如何告诉父对象我已经完成,请释放我(以避免内存泄漏),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40168260/