用到weak和unowned变量的另外一个地方就是使用协议(protocol)在多个class间去实现委托(delegation)的情况,因为swift中class是引用类型。结构体(structs)和enum(枚举)也能遵循协议,但是它们是值类型。如果一个父类带上一个子类使用委托,像这样:class Kraken: LossOfLimbDelegate { let tentacle = Tentacle() init() { tentacle.delegate = self } func limbHasBeenLost() { startCrying() } } protocol LossOfLimbDelegate { func limbHasBeenLost() } class Tentacle { var delegate: LossOfLimbDelegate? func cutOffTentacle() { delegate?.limbHasBeenLost() } } 那么我们就需要用weak变量。在这个例子里Tentacle以它所拥有的代理属性(delegate property)的形式持有一个对Kraken的强引用,同时Kraken在它的tentacle属性中也有一个对Tentacle的强引用。我们在代理声明之前加上一个weak说明符来解决: