jezzmemo/JJException

开启后,NSTimer定时针失效

xhm121 opened this issue · 5 comments

Describe the bug
OC版本中的
PushViewController.m文件中 - (void)testTimer方法,将_t 的target由self 变成[HMTimerProxy timerProxyWithObject:self] ,如下:
_t = [NSTimer scheduledTimerWithTimeInterval:0.1 target:[HMTimerProxy timerProxyWithObject:self] selector:@selector(scheduledMethod:) userInfo:nil repeats:YES];

HMTimerProxy是我自己的创建的一个对象,继承自NSObject

问题: 将定时器的target由self变成一个自己创建的第三者,就会导致定时器失效

#import "HMTimerProxy.h"

@interface HMTimerProxy ()

@Property (nonatomic, weak) id weakobject;

@EnD

@implementation HMTimerProxy

  • (instancetype)timerProxyWithObject:(id)weakObject {
    HMTimerProxy *timerProxy = [[HMTimerProxy alloc] init];
    timerProxy.weakobject = weakObject;
    return timerProxy;
    }
  • (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    if (self.weakobject) {
    return [self.weakobject methodSignatureForSelector:aSelector];
    } else {
    return [super methodSignatureForSelector:aSelector];
    }
    }

  • (void)forwardInvocation:(NSInvocation *)anInvocation {
    SEL selector = anInvocation.selector;
    if ([self.weakobject respondsToSelector:selector]) {
    [anInvocation invokeWithTarget:self.weakobject];
    } else {
    [super forwardInvocation:anInvocation];
    }
    }

明白你的问题了,这是因为NSTimer的中间者做了selector的验证,它需要显示的写对应的方法且存在,不支持你这种中间转发的方式

@xhm121 你这个类内部实现不太对,你可以看看YYTextWeakProxy内部的实现

明白你的问题了,这是因为NSTimer的中间者做了selector的验证,它需要显示的写对应的方法且存在,不支持你这种中间转发的方式

我看了市面上好几套防崩溃的框架,都会出现这个问题

@xhm121 你这个类内部实现不太对,你可以看看YYTextWeakProxy内部的实现

嗯,我这个是继承自NSObject,不是NSProxy。我是基于消息转发的第三步去做的。

@xhm121 你这个类内部实现不太对,你可以看看YYTextWeakProxy内部的实现

嗯,我这个是继承自NSObject,不是NSProxy。我是基于消息转发的第三步去做的。

你的问题解决了吗?
我直接下载使用YYTextWeakProxy ,定时器还是失效。