gpt4 book ai didi

Swift 运行时异常 : unrecognized selector

转载 作者:搜寻专家 更新时间:2023-11-01 07:09:52 26 4
gpt4 key购买 nike

在我的 ViewController 类中,我有一个函数:

func updateTimes() {
// (code)
}

我创建了一个计时器:

class ViewController: NSViewController {

var timer = Timer.scheduledTimer(timeInterval: 5,
target: self,
selector:
#selector(ViewController.updateTimes),
userInfo: nil,
repeats: true)

编译器对此很满意。在运行时,当计时器触发时,我得到一个异常:

无法识别的选择器发送到实例 0x6000000428b0

我做错了什么吗?

最佳答案

正如我在评论 NaGib ToroNgo 的回答时所写的那样,他给了我们一个很好的建议。

选择器可能不会发送到 ViewController 的实例。

我猜 ViewController 会采用这种形式:

class ViewController: UIViewController {

var timer = Timer.scheduledTimer(timeInterval: 5,
target: self,
selector: #selector(ViewController.updateTimes),
userInfo: nil,
repeats: true)

//...(Other property declarations or method definitions)...

func updateTimes() {
// (code)
}
}

变量timer被声明为实例属性,self用于timer的初始值。 (在一些旧版本的 Swift 中,这种用法会导致错误,所以我认为这行存在于任何方法中。)

在当前版本的Swift中(使用Swift 3.1/Xcode 8.3.3测试),上面的代码不会报错,但是self会被解释为self( )NSObjectProtocol 中声明的方法。因此,Selector("updateTimes") 被发送到表示方法引用(curried 函数)的闭包,而不是 ViewController 的实例。

闭包没有名为updateTimes的方法,导致异常:

unrecognized selector sent to instance


将初始值代码移动到一些实例上下文中,然后self代表ViewController的实例:

class ViewController: UIViewController {

var timer: Timer? //<- Keep `timer` as an instance property, but move the initial value code into `viewDidLoad()`.

//...(Other property declarations or method definitions)...

override func viewDidLoad() {
super.viewDidLoad()
//Do initialize the timer in the instance context.
timer = Timer.scheduledTimer(timeInterval: 5,
target: self,
selector: #selector(self.updateTimes),
userInfo: nil,
repeats: true)
//...
}

//In Swift 3, `@objc` is not needed, just for a preparation for Swift 4
@objc func updateTimes() {
// (code)
}
}

我相信这不会导致 unrecognized selector 异常。

关于Swift 运行时异常 : unrecognized selector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45650179/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com