iOS 关于修饰代理用weak还是assign_移动开发_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > 移动开发 > iOS 关于修饰代理用weak还是assign

iOS 关于修饰代理用weak还是assign

 2017/6/21 5:31:53  菁欣  程序员俱乐部  我要评论(0)
  • 摘要:1.对于strong:该对象强引用delegate,外界不能销毁delegate对象,会导致循环引用(RetainCycles)因为我们一般代理的都是当前的控制器比如scrollView.delegate=self;这时候就成了上面的一个圈的循环引用。如果上图delegate为强指针,那么也就是UIViewController和scrollView的retainCount永远最少都为1,所以有强指针指向的那个对象就不会销毁,这就造成了内存泄露。所以要想避免这种内存泄露
  • 标签:iOS 代理

1.对于strong:该对象强引用delegate,外界不能销毁delegate对象,会导致循环引用(Retain Cycles)

因为我们一般代理的都是当前的控制器 比如scrollView.delegate = self;这时候就成了上面的一个圈的循环引用。如果上图delegate为强指针,那么也就是UIViewController和scrollView的retainCount 永远最少都为1,所以有强指针指向的那个对象就不会销毁,这就造成了内存泄露。所以要想避免这种内存泄露,也就是避免像上述情况那种的循环引用,必须delegate为弱指针,这样,当UIViewContrller运行完自己的作用域要销毁时,发现没有强指针指向自己,并且retainCount=0,所以它就自动销毁了,而它指向的UIView也就没有了强指针指向,所以retainCount=0,所以也销毁了,这样NSArray也销毁了,最后scrollView也销毁了,就避免了内存泄露的问题。

2.对于assing:也有weak的功效。但是网上有assign是指针赋值,不对引用计数操作,使用之后如果没有置为nil,可能就会产生野指针;而weak一旦不进行使用后,永远不会使用了,就不会产生野指针。

经过一番研究,发现如果使用

@property (nonatomic, assign, readwrite) id delegate;

声明一个delegate,那么即便delegate指向的对象销毁了,delegate中依然会保存之前对象的地址,即delegate成为了一个野指针...

 

3.对于weak:指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁由外部控制。

而使用weak,则不会有上述问题,当delegate指向的对象销毁后,delegate = nil,

所以答案就是,使用weak。

 

发表评论
用户名: 匿名