我试图获得一个每5秒调用一次的方法,无论应用程序是打开还是在后台运行,所以在我的AppDelegate中,我认为有一个定时器可以调用它是一个好主意每5秒一个方法:
var helloWorldTimer = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(sayHello), userInfo: nil, repeats: true)
@objc func sayHello()
{
print("hello World")
}
然而,我收到此错误:
NSInvalidArgumentException', reason: '-[_SwiftValue sayHello]: unrecognized selector sent to instance
我并不完全确定为什么因为该方法被正确引用?有谁知道我为什么会收到这个错误?
答案 0 :(得分:5)
您崩溃是因为在AppDelegate完全初始化(self
)之前无法使用target: self
。所以你应该用这种方式初始化计时器:
var helloWorldTimer:Timer?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
self.helloWorldTimer = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(sayHello), userInfo: nil, repeats: true)
return true
}
从Setting a Default Property Value with a Closure or Function引用Apple文档:
如果使用闭包初始化属性,请记住其余部分 该实例尚未初始化 关闭执行。这意味着您无法访问任何其他 封闭内的属性值,即使这些属性也是如此 有默认值。
此外:
你也不能使用隐式自我属性, 或者调用任何实例的方法。