代码之家  ›  专栏  ›  技术社区  ›  Michał Ziobro

Swift如何返回子对象,该子对象在子对象内存中存在时保持其不变

  •  0
  • Michał Ziobro  · 技术社区  · 6 年前

    我考虑是否可以从父对象内部创建的函数子对象返回,该子对象将保留对其父对象的引用并防止父对象从内存中释放。同时我不想有保留周期和内存泄漏。

    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的释放

    0 回复  |  直到 6 年前
        1
  •  0
  •   Vlad Rusu    6 年前

    除了建立一个强大的参考循环,没有其他的方法。但是,如果达到这个程度,设计中可能会出现问题;永远不需要创建强引用循环。在您的情况下:

    1. ObjectB 直接,而是通过 ObjectA .

    2. 具体来说,你不需要 .

    3. 反对 在您的应用程序中非常重要,那么您应该在工厂之外管理它。

    反对 ObjA 在里面 ObjB

    如果您以其他隐藏方式需要它,那么您应该创建某种控制器或管理器来管理使用类的整个流。

    另外,非常重要的是,记住所有权必须只朝一个方向流动,而不是双向流动,并且几乎总是以与所有权相同的方式流动。如果 反对 的父级是 对象B ,那么 应该完全不知道 反对 .

    推荐文章