ARC 中,对于一般的 delegate,在声明中将其指定为 weak,在这个 delegate 实际的对象被释放的时候,会被重置回nil, 在Swift中和OC有些不同,如下所示
图片:
文本:
importUIKit
protocol MyDelegate:NSObjectProtocol{
funcmyMethod()
}
class My {
weak var delegate:MyDelegate?
}
class Demo:UIViewController,MyDelegate{
funcmyMethod() {
print("myMethod")
}
override func viewDidLoad() {
letmy =My()
my.delegate=self
}
}
/**
* 如果不加NSobjectProtocol,那么则会报错,报错内容error: 'weak' may only be applied to class and class-bound protocol types, not 'MyDelegate' weak var delegate: MyDelegate?
* 原因:Swift的protocol是可以被除了class以外的其他类型遵守的,而对于像struct或是enum这样的类型不通过引用计数来管理内存,所以不能用weak这样的ARC的概念来进行修饰。
* 解决办法:Swift中使用weak delegate,需要将protocol限制在class中
* 在protocol后面加入以下两种
1.NSObjectProtocol让协议遵循NSObjectProtocol这个协议
2.class限制协议只用在class中
*/
网友评论