使用系统的某些块api(如UIView的块版本写动画时),是否也考虑引用循环问题?
系统的某些块API中,UIview的块版本写动画时不需要考虑,但也有一些API需要考虑:
这些情况不需要考虑“引用循环”。
block的循环引用导致内存的泄露,ARC已经出来很久了,自动释放内存的确很方便,但是并非绝对安全绝对不会产生内存泄露。导致iOS对象无法按预期释放的一个无形杀手是——循环引用。循环引用可以简单理解为A引用了B,而B又引用了A,双方都同时保持对方的一个引用,导致任何时候引用计数都不为0,始终无法释放。若当前对象是一个ViewController,则在dismiss或者pop之后其dealloc无法被调用,在频繁的push或者present之后内存暴增,然后APP就挂了。下面列举我们变成中比较容易碰到的三种循环引用的情形。
/////检查内存泄露 可以使用Xcode自带的检查内存泄露的工具(instruments):leaks.
Product ->Profile 打开一个面板后选择leaks
当然有时候用这种检查方法还是检测不到内存泄露(检查结果全是绿色)
我们可以使用另一种比较笨拙但有效的方法
- (void)viewDidAppear:(BOOL)animated {
[superviewDidAppear:animated];
NSLog(@"进入控制器:%@", [[selfclass]description]);
}
- (void)dealloc {
NSLog(@"控制器被dealloc: %@", [[selfclass]description]);
}
在被释放的时候一定会调用dealloc里面的内容,如果不调用表示内存泄露,检查一下代码是否有循环引用现象。(可以写一个Demo 测试一下)真的是这样那,如果找到了循环引用的改成弱引用 当我改成弱引用的时候__weaktypeof(self)weakself =self;就会调用dealloc销毁,阻止了内存泄漏。
网友评论