(四十六)内存管理的复习
ARC的准则是:只要没有强指针指向对象,就会被销毁。
Tip:不写__weak的都是强指针。
一般对象用strong的目的是为了当前对相在,维护的这个成员也在。
注意循环引用应该一端用weak,一端用strong。
Tip:iOS5以前的retain和现在的strong是一个类型。
一些遗留问题:
1.UI控件的引用使用weak的原因:
控制器的view是强指针指向UIView,UIView内部有一个Subviews数组,这个数组也是强指针,在数组内存放的是对象的指针,也就是有一个强指针指向UI控件。
也就是说控制器在,UIView就在,Subviews在,UI控件就在,因此UI控件用weak和strong都可以。
使用weak能更好的保护内存,能用弱指针尽量用弱指针。
2.代理用weak的原因:
Tip:iOS5以前的assign就相当于现在的weak。
因为一般控件的代理都是控制器,以tableView为例,如果控制器强指针指向tableView,而tableView的代理再强指针指向控制器,就会引发无法释放的问题。
Tip:只要强指针构成环就无法销毁沿途各个对象。
3.copy属性:
复制分为深复制和浅复制(笔试题经常考)。
Tip:笔试常考@property用 copy、weak、strong、assign、retain还有OC语法等。
总结:
weak(原来的assign):代理、UI控件
strong(原来的retain):其他对象(除去字符串以外的普通OC对象)
copy:字符串
assign:非对象类型,基本数据类型,包括结构体和枚举。