jezzmemo/JJException

Swift和OC混编,Timer防护Crash

LuckyCat7848 opened this issue · 3 comments

问题:崩溃在 NSTimer+CleanTimer.m line 58

原因:Unrecognized selector +[XXX.XXXLoadingView methodSignatureForSelector:]
原因解析:XXXXXLoadingView是一个Swift class类,没有继承于NSObject,所以没有methodSignatureForSelector方法。
主要代码如下:
class XXXLoadingView {
var unFreezeTimer = Timer()
static var shared = HFSLoginLoadingView()
private init(){}

func startAnimate() {
    self.unFreezeTimer = Timer.scheduledTimer(timeInterval: 5, target: XXXLoadingView.self, selector: #selector(XXXLoadingView.hideLoadingView), userInfo: nil, repeats: true)
}

@objc class func hideLoadingView() {
    let loadingView = HFSLoginLoadingView.shared
    loadingView.unFreezeTimer.invalidate()
}

}

解决办法:

  1. 根据原因解析,使XXXLoadingView继承于NSObject即可。但所有Swift使用Timer都非要为此继承NSObject实在不是个好方式;
  2. 希望作者在NSTimer+CleanTimer中处理,我尝试了以下代码是可以的。可能也不是最好的方式,希望以供参考,作者更新一版本。还有基于此,这些防护是全局性的,希望能顺便检查其他功能,完善的更好。使混编时也可以放心使用JJException,作者大大辛苦啦🌹

@implementation TimerObject

  • (void)fireTimer{
    ......
    if ([self.target respondsToSelector:self.selector]) {
    // 加了这一段
    if (![self.target respondsToSelector:@selector(methodSignatureForSelector:)]) {
    [self.target performSelector:self.selector withObject:_timer];
    return;
    }
    NSMethodSignature* signature = [self.target methodSignatureForSelector:self.selector];
    ......
    }
    }
    @EnD

因为Swift的默认基类是SwiftObject,而SwiftObject的methodSignatureForSelector已经没有了,所以出现了这个问题,我看如何兼容下这个问题,谢谢您的建议

pod 'JJException',:git => 'https://github.com/jezzmemo/JJException.git'

麻烦帮忙确认下,观察几天再发版

作者每次解决都很快啊👍🏻!在项目中更新代码,查看已解决这个问题,也测试了Swift和OC各有参无参的case都OK。👍🏻