内存优化举例说几点

94 阅读2分钟
  • 修饰符关键字的错误使用
assign:实际是__unsafe_unretained类型的,
声明的变量对象释放后不会自动赋值为nil, 会造成野指针错误!

打开僵尸对象

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

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

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

  • 循环应用
并不是所有的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无限大,而且也不主动停止动画,基本就等于无限循环
  • 手动开辟内存不释放
  • 使用了不合理的API
  • 网络下载的图片过大
  • 第三方库的缓存机制
  • Masonry布局框架
  • 没必要常驻内存的对象,实现为常驻内存
  • 数据模型中冗余的字段
  • forwardingTargetForSelector不能返回self
  • UIGraphicsBeginImageContext之后调用UIGraphicsEndImageContex

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