iOS中的weak

2018-03-27  本文已影响4人  里克尔梅西

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对象,这是没有必要的造成内存的浪费。

https://www.zhihu.com/question/29927614?sort=created

上一篇 下一篇

猜你喜欢

热点阅读