什么情况使用weak关键字,相比assign有什么不同?

1.在ARC模式下,在有可能出现循环引用时,让其一端使用weak修饰。例如:delegate(代理)属性
2.自身已经对它强引用一次了,没有必再强引用一次使用weak解决。例如:自定义IBOutlet控件属性

  • 两者区别:
    1.weak只能用于修饰对象类型,基本数据类型不能使用
    2.assign修饰对象和基本数据类型都可以,但是只是简单地进行赋值操作而已

注意:assign修饰的对象(一般编译的时候会产生警告:Assigning retained object to unsafe property; object will be released after assignment)在释放之后,指针的地址还是存在的,也就是说指针并没有被置为nil,造成野指针。对象一般分配在堆上的某块内存,如果在后续的内存分配中,刚好分到了这块地址,程序就会崩溃掉。
那为什么可以用assign修饰基本数据类型?因为基础数据类型一般分配在栈上,栈的内存会由系统自己自动处理,不会造成野指针。
weak修饰的对象在释放之后,指针地址会被置为nil。所以现在一般弱引用就是用weak。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容