今天研究一个框架,看到它对NSTimer的处理,感觉很有意思。于是自己在各种情况下都研究了一下,现总结如下。
我们用到NSTimer时,似乎习惯于会在dealloc方法中把它invalidate掉,但是发现这样写并没有作用,NSTimer所在的类并没有被释放掉,而是继续执行NSTimer的方法。
所以,最终的解决方法应是在要释放NStimer所在类之前,invalidate它。
1.在UIView中
可以写在
- (void)willMoveToSuperview:(UIView *)newSuperview中,这个方法是把view添加到父控件或从父控件移除掉时会调用
例如:
- (void)willMoveToSuperview:(UIView *)newSuperview{ if (!newSuperview) {//从父控件移除时 [self.timer invalidate]; self.timer = nil; } NSLog(@"willMoveToSuperview"); }
2.UIViewController中
---push
- (void)willMoveToParentViewController:(UIViewController *)parent{ if (!parent) { [self.timer invalidate]; self.timer = nil; } }
--present
- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion{ [self.timer invalidate]; self.timer = nil; [super dismissViewControllerAnimated:flag completion:completion]; }
3.NSObject
这个我没找到方法,就自己写一个比如dismissAll的方法,然后在释放此对象之前调用这个方法即可。
总之原理就是,不管怎样,只要需要释放有NSTimer的类,就在释放它之前把它invalidate掉,不管是调用系统方法还是自定义方法。