*weak(assign) : 代理\UI控件
* strong(retain) : 其他对象(除代理\UI控件\字符串以外的对象)
* copy : 字符串、block【非ARC下不copy的Block会在栈中,ARC中的Block都会在堆上的】
* assign
weak比assign多了一个功能,当对象消失后自动把指针变成nil。
__unsafe_unretained 声明一个弱应用,但是不会自动nil化,也就是说,如果所指向的内存区域被释放了,这个指针就是一个野指针了。
__autoreleasing 用来修饰一个函数的参数,这个参数会在函数返回的时候被自动释放。
<1>代理为什么使用weak?
以UITableViewController为例,该控制器内部有一个tableView属性,该属性指向一个UITableView对象,UITableView 内又有两个属性:delegate和dataSource,都是assign,即弱指针,以delegate为例,而且一般UITableView的代理就是UITableViewController控制器;
如下图,若两条线都是强指针,会引发循环引用的问题,造成内存泄漏;
所以,一般代理都使用weak,即如下图,一强一弱,不会引发循环引用的问题,当然也不会造成内存泄漏;
结论:一般,控件的代理都是控制器,而控制器又拥有着该控件,所以,为了不引发循环引用的问题,代理一般都使用weak;
<2>UI控件
button的父view被移除掉。外层还引用这个button。会造成内存释放。、