weak和assign的区别:
weak是在对象被释放后自动置为nil的,所以不会出现野指针;而assign并不会使对象的引用计数加1,也就是说如果用assign去修饰一个对象,这个对象会立即被释放,重要的是assgin在被释放的时候是不会自动置为nil,还是保留对象的指针地址,会形成野指针,这个时候向其发送消息就会崩溃。
https://www.jianshu.com/p/ddecb19454ff
weak的原理
weak实际上一个hash表,具体实现挺复杂的,运用了runtime,并不是很理解,文章看下面两篇
https://www.jianshu.com/p/ed43b17c8a72
https://www.jianshu.com/p/13c4fb1cedea
delegate为什么用weak?
weak是弱引用,属性的变量在对象销毁后,会被自动置为nil,如果用strong,则在对象销毁后不会释放,容易造成内存泄露。一般来讲,控件的代理都是自身的控制器,而控制器又拥有该控件,因此为了防止循环引用,代理属性设置为weak。
我在MemoryDemo中有写例子。
https://www.jianshu.com/p/dc66bafc00f2
XIB中的UI控件为什么用weak?
因为controller-view-subviews-button,而view.subviews已经强引用button了,所以Controller并不直接拥有button,所以设置为weak即可。当view被remove后,用weak则button也跟着释放掉,如果用strong,则Controller还会持有button对象,这是没有必要的造成内存的浪费。
网友评论