在开发中,我们经常会遇到代理,或者自己写代理,而代理的属性都用weak修饰,看过有些开发者用strong,但是并未发现有何不妥,也不清楚用weak与strong修饰有何区别。
weak:指明该对象并不负责保持delegate这个对象,delegate这个对象的销毁由外部控制
strong:该对象饮用delegate,外界不能销毁delegate对象,会导致循环引用。
举例:
Dog.h 文件
屏幕快照 2016-02-24 11.41.24.pngDog.m文件:
屏幕快照 2016-02-24 11.41.33.pngPerson.h文件:
屏幕快照 2016-02-24 11.41.00.pngPerson.m文件:
屏幕快照 2016-02-24 13.25.26.pngViewController中实现:
屏幕快照 2016-02-24 13.25.05.png注:以上测试环境为ARC环境。
看一下打印的东西:
weak时:
屏幕快照 2016-02-24 13.29.34.pngstrong时:
无打印,说明Person和Dog对象都没有调用dealloc方法,两个对象未销毁。
这就是我们经常说的内存泄漏,该释放的内存并未释放!
具体分析之:
strong:
屏幕快照 2016-02-24 13.36.47.pngweak:
屏幕快照 2016-02-24 13.36.47 2.png此外,assign修饰的变量,当其retainCount为0时,什么也不会做。weak修饰的变量,当其retainCount为0时,会将该变量置为nil。
最后,看一看人家苹果的代理方法(UITableView):
屏幕快照 2016-02-24 14.33.15.png加油
网友评论