Swift如何返回子对象,只要子对象保留在内存中,该对象就保留父对象

问题描述

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

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的重新分配

解决方法

除了创建强大的参考周期外,别无其他方法。但是,如果达到此目的,则设计中可能会出现问题。您永远不需要创建一个强大的参考周期。就您而言:

  1. 也许您不应该直接使用ObjectB,而应该通过ObjectA的某些设计界面来使用。

  2. 如果您只需要ObjectB,则不需要ObjectA

  3. 如果ObjectA在您的应用程序中是如此重要,那么您应该在该工厂之外进行管理。

如果您不需要使用ObjectA(因为您不希望返回它),并且不会在该范围之外进行管理,那么您当然根本不需要它,并且您就能将您的逻辑移到该类之外(或者可以继承ObjA中的ObjB)。

无论如何,如果您仍然需要其他隐藏方式,则应该在使用类的地方创建某种控制器或管理器来管理整个流程。

同样非常重要的是,请记住,所有权必须仅以一种方式进行,绝不能同时采用,并且几乎总是以与所有权相同的方式进行控制。如果ObjectAObjectB的父项,那么ObjectB应该对ObjectA一无所知。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...