我的父对象创建一个子对象来执行一些异步操作。它涉及一些用户交互,这也是我没有使用 NSOperation 的原因之一。只有子对象知道它什么时候完成了它的任务,那么它怎么告诉它的父对象我已经完成了,请释放我以避免内存泄漏?
目前想出这个,父对象有个回调方法叫releaseChild ,就是child = nil ;当子对象完成其任务时,它调用父对象的 releaseChild 只是为了将自己设置为 nil。实际上,我将调用包装在 dispatch_after 中,但想法是一样的,子对象调用其父对象将自己设置为 nil。
我想知道有没有更好的方法?
-----更新-----
我知道写我 child 的“正常”方式是创建一个 UIViewController 对象,将其推送到 UINavigationController 。完成后用户可以弹出它,ARC 将释放它。这样,我不需要担心内存泄漏(通常)。但我认为当子对象完成时释放子对象的问题,只有它知道何时完成有一个边框应用程序而不是编写一个 UIViewController 对象。
Best Answer-推荐答案 strong>
在问题中:
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
在您的情况下,您可以让 child 在其初始化期间设置 alsoMe ,因此 child 开始控制自己的生命周期。当 child 决定它已经完成它的工作时,它只是调用 [self woeIsMe] 作为它的 final Action 。
注意:您当然可以删除方法并直接在子对象中设置实例变量,这样任何其他对象都很难杀死子对象。
如果父级出于任何原因需要对子级的引用,而不是让子级保持事件状态,那么它可以将该引用存储在一个变量中,该变量归因于断言存储在其中的引用的弱所有权,例如类似:
__weak MasterOfMyOwnDestiny *myChild = [MasterOfMyOwnDestiny new];
这样的引用不会使 myChild 引用的对象保持事件状态,并且会在该对象死亡时自动设置为 nil 。
关于ios - 在 ARC 中,子对象如何告诉父对象我完成了,请释放我(以避免内存泄漏),我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/40168260/
|