weak delegate
2015-10-02 本文已影响303人
sprint
delegate委托模式是一种常用的设计模式 ,我们通常将声明为delegate属性指定为weak,在这个delegate的实际的对象被释放时会被置为nil。在swift中我们也许会写出这样的代码:
protocol MyDelegate {
func method()
}
class MyClass {
weak var delegate:MyDelegate? //会编译错误
}
在delegate声明出会编译出错 “weak cannot be applied to non-class type MyDelegate”,
这是因为Swift的protocol是可以被 class struct enum这几种类型遵守,而对于struct enum这样的类型,本身就不能通过引用计数来管理内存,所以不能通过weak概念的关键字修饰。
要想在Swift中使用weak delegate,我们可以通过下面两种方式。
1,将protocol限制在class内实现。
protocol MyDelegate : class {
func method()
}
2,将protocol声明为Object-C的,这样可以通过在protocol前面加上@objc, Object-C的protocol只有类能实现,这样就合理了。
@objc protocol MyDelegate {
func method()
}
相比起@objc, clasc更能表现出问题实质,可以说是更好的解决方式。