控制器在被pop后移出栈后会被释放,但有些时候会发现控制器出栈的时候不会调用dealloc方法,归根结底,是由于当前控制器被某个对象强引用了,控制器的引用计数不为0,系统没法帮你释放这部份内存。app
当控制器中存在NSTimer时,就须要注意,由于当[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];时,这个/target:self/ 就增长了VC的RetarnCountr, 若是你不将这个timer invalidate,就别想调用dealloc。须要在viewWillDisappear以前须要把控制器用到的NSTimer销毁。atom
[timer invalidate]; // 销毁timer代理
timer = nil; // 置nil对象
例如@property (nonatomic, weak) id<HCAppViewDelegate> delegate;代理要使用弱引用,由于自定义控件是加载在视图控制器中的,视图控制器view对自定义控件是强引用,
若是代理属性设置为strong,则意味着delegate对视图控制器也进行了强引用,会形成循环引用。致使控制器没法被释放,最终致使内存泄漏。内存
block会把它里面的全部对象强引用(在ARC下)/PS:MRC下会retain加1/,包括当前控制器self,所以有可能会出现循环引用的问题。
即一个对象有一个Block属性,然而这个Block属性中又引用了对象的其余成员变量,那么就会对这个变量自己产生强应用,那么这个对象自己和他本身的Block属性就造成了循环引用。在ARC下须要修改为这样:(/也就是生成一个对自身对象的弱引用/)get
__weak typeof(self) weakSelf = self;it
即:保险起见block中全部的涉及到self的全给替换成weakSelf变量