如何在Swift中使用weak修饰Delegate

1.使用关键词“weak”是为了避免强引用导致的闭环。当两个对象相互强引用对方时就会引起引用闭环,他们的引用计数永远都不会为零;

2.仅当delegate是一个类时,使用weak关键词。Swift中的struct和enums是值对象类型(当一个新的实例生成时只是值复制),不是引用类型,所以它们不会引起强引用闭环;

3.weak引用是可选的(optional),所以必须使用var修饰词,这样在释放时可以置为nil;

4.父类对子类有强引用,从而不使用weak。但是当子类需要引用父类对象的时候,需要使用weak;

5.当不想拥有一个类的引用时,使用weak,而不仅仅是子类引用父类对象。当两个非继承的类对象需要相互引用对方时,选择一个使用weak;

6.建议delegate使用weak修饰,因为大多数情况,对象不需要拥有delegate。但是也有一些情况delegate是需要使用strong修饰,比如你在异步读取数据库时,可以在读取过程中保持delegate,在读取成功或者失败后,再设置delegate为nil;

7.协议protocol既可以用在类中也可以用在非类类型中(比如struct,enums),当在类中使用,需要标记协议类型是class

protocol MyClassDelegate: class {
    // ...
}

class SomeClass {
    weak var delegate: MyClassDelegate?
}
posted @ 2017-07-03 08:41  Lawerence  阅读(1111)  评论(0编辑  收藏  举报