如何解决Swift如何返回子对象,只要子对象保留在内存中,该对象就保留父对象
我考虑是否有可能从在父对象内部创建的函数子对象返回,该子对象将保留对其父对象的引用并防止从内存中释放父对象。同时,我不想保留周期和内存泄漏。
class ObjectA {
let objectB = ObjectB()
}
class ObjectB {
}
func factoryFunc() -> ObjectB {
ObjectA().objectB
}
客户代码
let objB = factoryFunc()
// but keep also ObjectA as long as objB lives
// but do not create retain cycle
// I do not want to return ObjectA and do not want to manage it outside of black box factory method.
我可以添加
class ObjectB {
var parent: ObjectA?
}
它会导致保留周期和内存泄漏
class ObjectB {
weak var parent: ObjectA?
}
这不会阻止ObjectA的重新分配
解决方法
除了创建强大的参考周期外,别无其他方法。但是,如果达到此目的,则设计中可能会出现问题。您永远不需要创建一个强大的参考周期。就您而言:
-
也许您不应该直接使用
ObjectB
,而应该通过ObjectA
的某些设计界面来使用。 -
如果您只需要
ObjectB
,则不需要ObjectA
。 -
如果
ObjectA
在您的应用程序中是如此重要,那么您应该在该工厂之外进行管理。
如果您不需要使用ObjectA
(因为您不希望返回它),并且不会在该范围之外进行管理,那么您当然根本不需要它,并且您就能将您的逻辑移到该类之外(或者可以继承ObjA
中的ObjB
)。
无论如何,如果您仍然需要其他隐藏方式,则应该在使用类的地方创建某种控制器或管理器来管理整个流程。
同样非常重要的是,请记住,所有权必须仅以一种方式进行,绝不能同时采用,并且几乎总是以与所有权相同的方式进行控制。如果ObjectA
是ObjectB
的父项,那么ObjectB
应该对ObjectA
一无所知。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。