Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift如何返回子对象,只要子对象存在于内存中,该子对象就会保留父对象 我考虑是否可以从父对象内部创建的函数子对象返回,该父对象将保持对父对象的引用,并防止父内存从内存中释放。同时,我不想有保留周期和内存泄漏 class ObjectA { let objectB = ObjectB() } class ObjectB { } func factoryFunc() -> ObjectB { ObjectA().objectB }_Swift_Memory Leaks_Factory_Weak References_Retain Cycle - Fatal编程技术网

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应该是某种单例,并且应该管理根视图控制器。您应该能够从任何地方访问流控制器,然后流控制器应该负责创建根视图控制器。尝试将层次结构保留在依赖项中。另一种方法是交换所有权,这意味着根视图控制器有一个流控制器,并询问它应该如何管理流。