参考博客:
http://www.cocoachina.com/ios/20170328/18962.html
http://www.jianshu.com/p/2bf505398f51
想要了解assign和weak的区别,先要知道底层实现原理:
1.assign实现原理:
2.weak的的实现原理原理
runtime会维护一个哈希表来存储所有weak的对象,这个哈希表以weak的对象地址值为键,value为指向该对象的所有弱引用的指针(弱引用指针数组)。
weak的好处:
使用weak的好处是在对象dealloc后,weak数组中的所有变量值会置为nil。
如果对象使用了assign,对象dealloc后,那么我们再访问这个对象的话就会出现野指针。
weak修饰基本数据类型会由什么后果呢?
答案是你不需要考虑,因为编译通过不了。weak只能修饰对象。
//注释:
如果一个属性为数组,你声明为weak,那么你是无法使用的。因为你从来没有保留过这个对象。即从来没有retain过这个对象,因此打印它会发现一只是nil。
例1:
这里对象用weak修饰之后,全局变量并没有持有全局NSObject对对象,但是当对象销毁之后,系统会把全局变量置为nil。
例2:
这里对象用assign修饰后,全局变量并没有持有次对象。办事却保留了对象的地址。后边访问会出现野指针错误。
基本类型用weak或者assign修饰,编译都不会通过。因此这是不需要我们考虑的。