• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

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

[复制链接]
菜鸟教程小白 发表于 2022-12-13 14:18:50 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

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

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

我想知道有没有更好的方法?

-----更新-----

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



Best Answer-推荐答案


在问题中:

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/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap