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。