标题:
内存管理(2)
[打印本页]
作者:
look_w
时间:
2019-3-11 20:35
标题:
内存管理(2)
二.定时器
使用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)proxyWithTarget
id)target;
@property (weak, nonatomic) id target;
@end
.m:
@implementation MJProxy
+ (instancetype)proxyWithTarget
id)target
{
// NSProxy对象不需要调用init,因为它本来就没有init方法
MJProxy *proxy = [MJProxy alloc];
proxy.target = target;
return proxy;
}
- (NSMethodSignature *)methodSignatureForSelector
SEL)sel
{
return [self.target methodSignatureForSelector:sel];
}
- (void)forwardInvocation
NSInvocation *)invocation
{
[invocation invokeWithTarget:self.target];
}
@end
ViewController:
self.timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:[MJProxy proxyWithTarget:self] selector
selector(timerTest) userInfo:nil repeats:YES];
使用NSProxy
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/)
Powered by Discuz! 7.0.0