关于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;
}
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;
}
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- C#使用委托(delegate)实现在两个form之间传递数据的方法
- C#利用delegate实现Javascript的each方法
- Query中click(),bind(),live(),delegate()的区别
- 详解jquery事件delegate()的使用方法
- jQuery中 delegate使用的问题
- 浅谈jquery中delegate()与live()
- 由点击页面其它地方隐藏div所想到的jQuery的delegate
- jQuery中delegate与on的用法与区别示例介绍
- JS delegate与live浅析
- jQuery事件 delegate()使用方法介绍
- 讲解iOS开发中基本的定位功能实现
- iOS中定位当前位置坐标及转换为火星坐标的方法
- js判断客户端是iOS还是Android等移动终端的方法