首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >保留循环Swift闭包

保留循环Swift闭包
EN

Stack Overflow用户
提问于 2017-05-17 15:44:25
回答 1查看 605关注 0票数 0

我正在考虑使用此模式(或类似的模式)来观察纯Swift对象上的更改。

这段代码有没有内存泄漏?

代码语言:javascript
复制
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的情况下迁移到更多虚拟机架构。

EN

回答 1

Stack Overflow用户

发布于 2017-05-17 16:28:24

因为:

代码语言:javascript
复制
HouseHold has Person, HouseHold has changes, Person has HouseHold.changes. 

上面没有循环。

如果您的代码更改为:

代码语言:javascript
复制
person.listen = self

情况是这样的:

代码语言:javascript
复制
HouseHold has Person, Person has HouseHold. 

您可以通过检查deinit方法来测试泄漏:

代码语言:javascript
复制
class Person {

    //...

    deinit {
        print("Person deinited")
    }
}

class HouseHold {

    //...

    deinit {
        print("HouseHold deinited")
    }
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44018581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档