您的位置:首页 > 移动开发 > IOS开发

关于IOS delegate的weak和assign 探讨

2016-03-10 10:06 281 查看
在使用IOS的别人写的SDK时,发现定义的delegate都是assign修饰的,相信很多人也会和我一样刚开始表示很不解。
1、delegate为什么用weak来修饰?
delegate 之所以用weak来修饰,是防止循环引用,weak属性的变量是不为其所属对象持有的,并且在该变量被销毁之后,此weak变量的值会自动被赋值为nil。而assign属性一般是对C基本数据类型成员变量的声明,当然也可以用在对象类型成员变量上,只是其代表的意义只是单纯地拷贝所赋值变量的值。即如果对某assign成员变量B赋值某对象A的指针,则此B只是简单地保存此指针的值,且并不持有对象A,也就意味着如果A被销毁,则B就指向了一个已经被销毁的对象,如果再对其发送消息会引发崩溃。





2、那关于delegate 既然用weak这么好用,用assign会出现野指针,为什么还会用呢?
weak和strong属性是ARC才引入的,而在MRC情况下,只能使用assign修饰了。weak之所以强大的地方,是当引用的对象被销毁时,它的值也会变为nil,所以推荐使用ARC。
3、当自己在使用前人写好的MRC代码,那这些delegate怎么来使用呢?

像这样写在ViewController被销毁时,将delegate制空。在ARC模式下,我们不需要继承父类的dealloc方法(不用写[super dealloc])

-(void)dealloc {

    self.XXX.delegate = nil;

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  delegate weak assign arc ios