今天检测内存泄漏发现一个子view不执行dealloc方法,查找资料后发现跟NSTimer有关,做下笔记:
平时我们用NSTimer时,习惯在dealloc方法中把它invalidate掉并置nil,但是发现这样写并没有作用,NSTimer所在的类并没有被释放掉,而是继续执行NSTimer的方法。
所以,我们应该在要释放NStimer所在类之前,invalidate它。
1.在UIView中
可以写在
- (void)willMoveToSuperview:(UIView *)newSuperview中,这个方法是把view添加到父控件或从父控件移除掉时会调用。
2.UIViewController中
如果是push在
- (void)willMoveToParentViewController:(UIViewController *)parent 中释放timer。
如果是present在
- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void(^)(void))completion 中释放timer
ps:如果是vc,在willDismiss中释放也行。
网友评论