Swift如何返回子对象,只要子对象存在于内存中,该子对象就会保留父对象 我考虑是否可以从父对象内部创建的函数子对象返回,该父对象将保持对父对象的引用,并防止父内存从内存中释放。同时,我不想有保留周期和内存泄漏 class ObjectA { let objectB = ObjectB() } class ObjectB { } func factoryFunc() -> ObjectB { ObjectA().objectB }
客户端代码Swift如何返回子对象,只要子对象存在于内存中,该子对象就会保留父对象 我考虑是否可以从父对象内部创建的函数子对象返回,该父对象将保持对父对象的引用,并防止父内存从内存中释放。同时,我不想有保留周期和内存泄漏 class ObjectA { let objectB = ObjectB() } class ObjectB { } func factoryFunc() -> ObjectB { ObjectA().objectB },swift,memory-leaks,factory,weak-references,retain-cycle,Swift,Memory Leaks,Factory,Weak References,Retain Cycle,客户端代码 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
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
(因为您不希望返回它),并且您不会在该范围之外管理它,那么您肯定根本不需要它,您将能够将逻辑移到该类之外(或者在ObjB
中继承ObjA
)
如果您以其他隐藏方式需要它,那么您应该创建某种控制器或管理器来管理使用这些类的整个流
另外,非常重要的是,请记住,所有权必须只有一种方式,而不是两种方式,并且,几乎总是以与所有权相同的方式进行控制。如果
ObjectA
是ObjectB
的父对象,那么ObjectB
应该对ObjectA
一无所知。ObjectA必须引用ObjectB吗?我认为是的,因为实际上是流控制器将ObjectB作为rootViewController,所以ObjectB被用来推送新的控制器。我可以返回这个flowController,但它只有在其中一个应用程序的情况下才有意义。在其他使用此选项的应用程序中,我更喜欢直接返回rootViewController,但仍然重复使用此flowcontroller导航。您可以在所谓的父对象a中使ObjectB引用“弱”吗?如果是流问题,您确实可以创建一个强引用,并在viewWillEnglish
或其他一些方法中处理内存清理,我们称之为flowcycle方法。我可以在viewWillEnglish中创建retain cycle,然后在viewWillEnglish中中断它,就像将nil赋值给var parentObjA:ObjectA一样。嗯,这是个好主意。但最后,我创建了同时包含ObjectA和ObjectB的ObjectC。C是持有FlowController的NavigationController,并将其rootViewController用作NavigationControllerObjectA是子FlowController,ObjectB是rootViewController。FlowController管理ObjectB的这部分应用程序子视图的导航。因此,流量很重要。但另一方面,我不想返回整个FlowController,只想返回rootViewController,但在这个FlowController中保留导航逻辑。也许我应该使包装ViewController或NavigationController引用flow controller,并将此rootViewController添加为其根。在这种情况下,flow controller应该是某种单例,并且应该管理根视图控制器。您应该能够从任何地方访问流控制器,然后流控制器应该负责创建根视图控制器。尝试将层次结构保留在依赖项中。另一种方法是交换所有权,这意味着根视图控制器有一个流控制器,并询问它应该如何管理流。