关于IOS delegate的weak和assign 探讨


在使用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;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值