我正在考虑使用此模式(或类似的模式)来观察纯Swift对象上的更改。
这段代码有没有内存泄漏?
class Person {
var name: String {
didSet{
self.listen?(self)
}
}
var phone: Int {
didSet{
self.listen?(self)
}
}
var listen: ((_ person: Person) -> Void)?
init(withName N: String, andPhone P: Int) {
self.name = N
self.phone = P
}
}
class HouseHold {
var people = [Person]()
let changes: (_ person: Person) -> Void = { person in
print(person.name)
}
init(withPeople P: [Person]){
self.people = P
for person in people {
person.listen = self.changes
}
}
}
let jon = Person(withName: "Jon", andPhone: 1232344567)
let thais = Person(withName: "Thais", andPhone: 1232344567)
let apartment = HouseHold(withPeople: [jon, thais])
jon.phone = 1232399999
jon.name = "Jon Smith"
jon.phone = 9999999999
thais.name = "Thais Smith"另外,假设我有一个UIViewController,它以同样的方式侦听来自Person对象的更改,而不是HouseHold。会不会有内存泄漏?
此外,欢迎对该模式的评论。我喜欢使用泛型,这样我就不必为我想要观察的每个属性创建一个函数。或者像代码目前所做的那样传递整个对象。
注意:在游乐场编译
注2:尝试在不使用reactive cocoa的情况下迁移到更多虚拟机架构。
发布于 2017-05-17 16:28:24
因为:
HouseHold has Person, HouseHold has changes, Person has HouseHold.changes. 上面没有循环。
如果您的代码更改为:
person.listen = self情况是这样的:
HouseHold has Person, Person has HouseHold. 您可以通过检查deinit方法来测试泄漏:
class Person {
//...
deinit {
print("Person deinited")
}
}
class HouseHold {
//...
deinit {
print("HouseHold deinited")
}
}https://stackoverflow.com/questions/44018581
复制相似问题