问题描述
我考虑是否有可能从在父对象内部创建的函数子对象返回,该子对象将保留对其父对象的引用并防止从内存中释放父对象。同时,我不想保留周期和内存泄漏。
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
一无所知。