当对象 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)
这也是一个保留周期吗?
我也这么认为,有一个retain cycle。什么仪器显示内存泄漏?
一般来说,手动引用计数和自动引用计数,引用ilands会泄漏。引用循环可以由不止2个对象组成。
也就是说,我鼓励您在操场上测试一些代码,因为您问题中的示例存在一些语法和语言错误。
下面的代码可能是一个起点:
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
然后继续玩变体 ;-)
希望对您有所帮助
对可能是保留循环的情况感到困惑?
我明白如果
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)
这也是一个保留周期吗?
我也这么认为,有一个retain cycle。什么仪器显示内存泄漏?
一般来说,手动引用计数和自动引用计数,引用ilands会泄漏。引用循环可以由不止2个对象组成。
也就是说,我鼓励您在操场上测试一些代码,因为您问题中的示例存在一些语法和语言错误。
下面的代码可能是一个起点:
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
然后继续玩变体 ;-)
希望对您有所帮助