簡體   English   中英

當對象A具有對象B作為屬性並且對象B具有包含對象A的數組屬性時,在Swift中保持循環?

[英]Retain cycle in Swift when Object A has Object B as a property and Object B has an array property that contains Object A?

對可能是保留周期的情況感到困惑?

我了解如果

class Object-A {
  var b: Object-B }

class Object-B {
    var a: Object-A
]

那么上面是可怕的設計,因為如果你這樣做

var a = Object-A()
var b = Object-B()
a.b = b
b.a = a

那么這會導致一個保留周期,兩個強引用指向彼此。

但是,如果情況不佳怎么辦?

class Object-A {
    var b: Object-B 
}

class Object-B {
    var randomArrayProperty: [Object-B]
}

而你嘗試去做

var a = Object-A()
var b = Object-B()
a.b = a
b.randomArrayProperty.append(a)

這也是一個保留周期嗎?

一般來說,使用手動參考計數和自動參考計數,參考會泄漏。 參考周期可以由兩個以上的對象組成。

就是說,我鼓勵您在操場上測試一些代碼,因為問題中的示例存在一些語法和語言錯誤。

下面的代碼可能是一個起點:

class ObjectA {
    let name: String
    var b: ObjectB

    init(name: String, b: ObjectB) {
        self.name = name
        self.b = b
    }

    deinit {
        print("\(name) deallocated")
    }
}

class ObjectB {
    let name: String
    var randomArrayProperty = [ObjectA]()

    init(name: String) {
        self.name = name
    }

    deinit {
        print("\(name) deallocated")
    }
}

// Create a _possible_ leak. It depends on what we'll do next
var b: ObjectB? = ObjectB(name: "Foo B")
var a: ObjectA? = ObjectA(name: "Bar A", b: b!)
b?.randomArrayProperty.append(a!)

// No leaks
a = nil
// Remove a from array inside b, a will dealloc
b?.randomArrayProperty.removeLast()
b = nil

// Recreate a _possible_ leak.
b = ObjectB(name: "Foo1 B")
a = ObjectA(name: "Bar1 A", b: b!)
b?.randomArrayProperty.append(a!)

// Leaks
a = nil
b = nil

然后繼續玩變體;-)

希望這可以幫助

我認為是這樣,有一個保留周期。 哪種儀器顯示內存泄漏?

暫無
暫無

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

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