- 修饰符关键字的错误使用
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无限大,而且也不主动停止动画,基本就等于无限循环
- 手动开辟内存不释放
- 使用了不合理的API
- 网络下载的图片过大
- 第三方库的缓存机制
- Masonry布局框架
- 没必要常驻内存的对象,实现为常驻内存
- 数据模型中冗余的字段
- forwardingTargetForSelector不能返回self
- UIGraphicsBeginImageContext之后调用UIGraphicsEndImageContex
站在巨人的肩膀上学习!如有侵权,请联系删除












网友评论