【发布时间】:2020-09-21 16:40:14
【问题描述】:
我考虑是否可以从在父对象中创建的函数子对象返回,该子对象将保留对其父对象的引用并防止父对象从内存中释放。同时我不想保留循环和内存泄漏。
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 的释放
【问题讨论】:
-
ObjectA 必须持有对 ObjectB 的引用吗?
-
我认为是的,因为实际上它是具有 objectB 作为 rootViewController 的流控制器,因此 objectB 用于推送新控制器。我可以返回这个 flowController 但它只在应用程序之一的情况下才有意义。在使用它的其他应用程序中,我更喜欢直接返回 rootViewController 但仍然重用这个 flowcontroller 导航。
-
你能在所谓的父 ObjectA 中使 ObjectB 引用“弱”吗?
-
如果是流程问题,您确实可以在
viewWillDisappear或其他一些我们称之为flowcycle 方法中创建强引用并处理内存清理。 -
我可以创建保留周期,然后在 viewWillDisappear 中打破它,就像将 nil 分配给 var parentObjA: ObjectA 一样。嗯,这是个好主意。但最后我创建了同时包含 ObjectA 和 ObjectB 的 ObjectC。 C是NavigationController,它持有FlowController并将它的rootViewController用作NavigationController的rootViewController
标签: swift memory-leaks factory weak-references retain-cycle