静态函数无法识别的选择器发送到类

时间:2018-06-14 13:42:10

标签: swift static unrecognized-selector

我有一个简单的ViewController,每3秒触发一次计时器,当我使用下面的代码时,它按预期工作。

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        var myTimer = MyTimer()
        myTimer.triggerTimer()
    }
}

class MyTimer: NSObject {
    var timer: Timer?

    func triggerTimer() {
        DispatchQueue.main.async {
            if self.timer == nil {
                self.timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(self.timeout), userInfo: nil, repeats: true)
            }
        }
    }

    @objc func timeout() {
        print("timeout")
    }
}

但是当我将timertriggerTimer()更改为static时,会发生错误。这是调用错误的代码:

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        MyTimer.triggerTimer()
    }
}

class MyTimer: NSObject {
    static var timer: Timer?

    static func triggerTimer() {
        DispatchQueue.main.async {
            if self.timer == nil {
                self.timer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(self.timeout), userInfo: nil, repeats: true)
            }
        }
    }

    @objc func timeout() {
        print("timeout")
    }
}

错误是:

unrecognized selector sent to class 0x10906b338'
*** First throw call stack:
(
    0   CoreFoundation                      0x000000010a2dc1e6     __exceptionPreprocess + 294
    1   libobjc.A.dylib                     0x0000000109971031 objc_exception_throw + 48
    2   CoreFoundation                      0x000000010a35d6c4 +[NSObject(NSObject) doesNotRecognizeSelector:] + 132
    3   CoreFoundation                      0x000000010a25e898 ___forwarding___ + 1432
    4   CoreFoundation                      0x000000010a25e278 _CF_forwarding_prep_0 + 120
    5   Foundation                          0x00000001093db4dd __NSFireTimer + 83
    6   CoreFoundation                      0x000000010a26be64 __CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 20
    7   CoreFoundation                      0x000000010a26ba52 __CFRunLoopDoTimer + 1026
    8   CoreFoundation                      0x000000010a26b60a __CFRunLoopDoTimers + 266
    9   CoreFoundation                      0x000000010a262e4c __CFRunLoopRun + 2252
    10  CoreFoundation                      0x000000010a26230b CFRunLoopRunSpecific + 635
    11  GraphicsServices                    0x000000010fe57a73 GSEventRunModal + 62
    12  UIKit                               0x000000010a7590b7 UIApplicationMain + 159
    13  StaticProject                       0x0000000109067b27 main + 55
    14  libdyld.dylib                       0x000000010e747955 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

我在网站上搜索并看到了一些类似的问题,但我无法找到有关此问题的答案。任何人都可以给我一些提示吗?谢谢。

1 个答案:

答案 0 :(得分:1)

由于现在timer: Timer?triggerTimer()是静态的,您需要将timeout方法设为静态,对代码进行以下更改....

@objc static func timeout() {
   print("timeout")
}