二.定时器
使用CADisplayLink、NSTimer有什么注意点?
循环引用、NSTimer定时器不准
1.CADisplayLink、NSTimer使用注意
问题:CADisplayLink、NSTimer会对target产生强引用,如果target又对它们产生强引用,那么就会引发循环引用
解决方案:
方案1:使用block
__weak typeof(self) weakSelf = self;
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES block:^(NSTimer * _Nonnull timer) {
[weakSelf timerTest];
}];
方案2:使用代理对象(NSProxy)
如果MJProxy继承NSObject,会去父类里面搜索是否有这个方法。如果继承NSProxy,他直接就进入消息转发了。所以我们使用NSProxy。
MJProxy:
.h:
@interface MJProxy : NSProxy
+ (instancetype)proxyWithTargetid)target;
@property (weak, nonatomic) id target;
@end
.m:
@implementation MJProxy
+ (instancetype)proxyWithTargetid)target
{
// NSProxy对象不需要调用init,因为它本来就没有init方法
MJProxy *proxy = [MJProxy alloc];
proxy.target = target;
return proxy;
}
- (NSMethodSignature *)methodSignatureForSelectorSEL)sel
{
return [self.target methodSignatureForSelector:sel];
}
- (void)forwardInvocationNSInvocation *)invocation
{
[invocation invokeWithTarget:self.target];
}
@end
ViewController:
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:[MJProxy proxyWithTarget:self] selectorselector(timerTest) userInfo:nil repeats:YES];
使用NSProxy |