读书笔记: swift tips weak delegate

关于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

你可能感兴趣的:(读书笔记: swift tips weak delegate)