NSTimer大多数情况下载viewWillDisappear或者viewDidDisappear中释放就可以。但是有的场景是跳转到下一级页面,还需要NSTimer在跑,这时候就不能在那两个方法里面stopTimer了。 dealloc这个方法根本就不会触发。 方法有很多,但是以下方法感觉最简单,改动小。
新建一个类。HFTimerProxy
HFTimerProxy.h
@interface HFTimerProxy : NSProxy
@property(weak, nonatomic) id target;
@end
HFTimerProxy.m
#import "HFTimerProxy.h"
#import
@implementation HFTimerProxy
- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel {
return [self.target methodSignatureForSelector:sel];
}
- (void)forwardInvocation:(NSInvocation*)invocation {
[invocationinvokeWithTarget:self.target];
}
@end
在对应的VC页面添加属性
@property (strong, nonatomic) HFTimerProxy *timerProxy;
- (HFTimerProxy *)timerProxy {
if(!_timerProxy) {
_timerProxy= [HFTimerProxyalloc];
_timerProxy.target = self;
}
return _timerProxy;
}
在创建Timer时,target使用self.timerProxy
/// 创建定时器
- (void)createTimer{
[self stopTimer];
//创建 1 秒回调一次定时器
self.timer = [NSTimer timerWithTimeInterval:1 target:self.timerProxy selector:@selector(timerCallBack:) userInfo:nil repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:self.timer forMode:NSRunLoopCommonModes];
}
网友评论