assign和weak的区别

参考博客:

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

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

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

1.assign实现原理:

assign底层原理

2.weak的的实现原理原理

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

weak的好处:

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

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

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

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

//注释:

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


例1:

对象用weak修饰

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

例2:

对象用assign修饰

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

友情链接更多精彩内容