簡體   English   中英

Swift如何返回只要孩子生活在內存中就保持父對象的子對象

[英]Swift How to return child object that keeps parent object as long as child lives in memory

我考慮是否可以從在父對象中創建的函數子對象返回,該子對象將保留對其父對象的引用並防止父對象從內存中釋放。 同時我不想保留周期和內存泄漏。

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 (因為您不希望它返回),並且您不會在該范圍之外管理它,那么您當然根本不需要它,並且您將能夠移動您的邏輯之外的類(或者繼承ObjAObjB )。

如果您無論如何都需要以其他隱藏方式使用它,那么您應該創建某種控制器或管理器來管理您使用類的整個流程。

此外,非常重要的是,請記住所有權只能以一種方式進行,而不能雙向進行,並且幾乎總是以與所有權相同的方式進行控制。 如果ObjectA是的父ObjectB ,那么ObjectB應該知道絕對沒有關於ObjectA

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM