assign和weak的区别

参考博客:

http://www.cocoachina.com/ios/20170328/18962.html

http://www.jianshu.com/p/2bf505398f51

想要了解assign和weak的区别,先要知道底层实现原理:

1.assign实现原理:

assign和weak的区别_第1张图片
assign底层原理

2.weak的的实现原理原理

runtime会维护一个哈希表来存储所有weak的对象,这个哈希表以weak的对象地址值为键,value为指向该对象的所有弱引用的指针(弱引用指针数组)。

weak的好处:

使用weak的好处是在对象dealloc后,weak数组中的所有变量值会置为nil。

如果对象使用了assign,对象dealloc后,那么我们再访问这个对象的话就会出现野指针。

weak修饰基本数据类型会由什么后果呢?

答案是你不需要考虑,因为编译通过不了。weak只能修饰对象。

//注释:

如果一个属性为数组,你声明为weak,那么你是无法使用的。因为你从来没有保留过这个对象。即从来没有retain过这个对象,因此打印它会发现一只是nil。


例1:

assign和weak的区别_第2张图片
对象用weak修饰

这里对象用weak修饰之后,全局变量并没有持有全局NSObject对对象,但是当对象销毁之后,系统会把全局变量置为nil。

例2:

assign和weak的区别_第3张图片
对象用assign修饰

这里对象用assign修饰后,全局变量并没有持有次对象。办事却保留了对象的地址。后边访问会出现野指针错误。

基本类型用weak或者assign修饰,编译都不会通过。因此这是不需要我们考虑的。

你可能感兴趣的:(assign和weak的区别)