内存优化举例说几点

2020-08-13  本文已影响0人  一个半吊子工程师
assign:实际是__unsafe_unretained类型的,
声明的变量对象释放后不会自动赋值为nil, 会造成野指针错误!

打开僵尸对象

通过打开僵尸对象,我们可以检测出一些野指针问题
打开方式

image

比如下面这段代码运行就会报错

image

所以,开发中delegate用weak来修饰
参考:https://www.jianshu.com/p/606999eb9297

并不是所有的block用self就会造成循环引用,
只有相互强引用才会发生循环引用。比如下面用self就不会造成循环引用
Block xxx = ^{
        [self xxx];
    };
使用block时还要注意一些隐式调用self的方式,比如:_obj

self.block = ^{
        _obj = [xxxx new];
    };
如果使用NSTimer做定时器,一定要在合适的时机销毁这个定时器,
不然可能导致内存得不到释放。原因就是循环引用
Timer 添加到 Runloop(这里是主线程,默认开启了runloop) 的时候,
会被 Runloop 强引用,然后 Timer 又会有一个对 Target 的强引用(也就是 self ),
循环引用了,也就是 NSTimer 强引用了 self ,
导致 self 一直不能被释放掉,所以也就走不到 self 的 dealloc 里。
NSNotification addObserver之后,在dealloc里面添加remove
动画的repeat count无限大,而且也不主动停止动画,基本就等于无限循环

站在巨人的肩膀上学习!如有侵权,请联系删除

上一篇 下一篇

猜你喜欢

热点阅读