关于delegate的使用
在ARC模式下,使用delegate的时候,为了避免循环引用,我们常常会采用weak delegate的方式,在weak属性被释放的时候,ARC会帮助我们将weak属性置为nil,大大降低了我们出错。
而在swift中,如果我们用weak关键字来修饰delegate,是无法编译通过的:
import Foundation
protocol ExampleProtocol {
}
class WeakClass {
weak var delegate : ExampleProtocol?
}
//error 'weak' may only be applied to class and class-bound protocol types
这是因为swift的中protocol并不仅限于class类型,而值类型(struct,enum)也可以实现协议,而值类型本身就不是通过引用计数来管理内存的,所有也不存在ARC的引用计数。
swift中weak delegate的使用
想要在swift中实现weak delegate我们可以有2种方法,第一种我们可以在protocol声明前加上@objc 关键字,这样可以将协议的遵守者,限定为class实例,本质是协议成了objc的协议,并且只能有NSObject的子类来实现。
import Foundation
@objc protocol ExampleProtocol {
}
class WeakClass {
weak var delegate : ExampleProtocol?
}
//build succeeded
这是一种可以满足的需求的方案,还有一种更优雅的做法是将我们的delegate限定为class类型才可以实现:
import Foundation
//在协议名称后加上 : class
protocol ExampleProtocol : class {
}
class WeakClass {
weak var delegate : ExampleProtocol?
}
//build succeeded
这是一种更加优雅,更加符合swift风格的方式,也可以避免与objc兼容性的问题。
本文是读书笔记,原文请点击DELEGATE
网友评论