[英]EXC_BAD_ACCESS using self.performSelector
這是一個簡單的學術而不是真正的代碼。
我想使用performSelector函數運行print方法。 但是,如果我在操場上運行此代碼,則拋出異常:
EXC_BAD_ACCESS(代碼= EXC_I386_GPFLT)。
碼:
//: Playground - noun: a place where people can play
import UIKit
@objc(Foo)
class Foo: NSObject {
func timer() {
self.performSelector( #selector(Foo.print))
}
@objc func print() {
NSLog("print")
}
}
let instance = Foo()
instance.timer() // <-- EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
問題出在哪兒?
嘗試將您的Foo.print()
更改為以下內容:
@objc func print() -> AnyObject? {
NSLog("print")
return nil
}
我相信代碼也在Playground中運行。
performSelector
的返回類型不是Void
。
func performSelector(_ aSelector: Selector) -> Unmanaged<AnyObject>!
因此,Playground會嘗試顯示結果值。 實際上並沒有退回。
這是一個不需要更改函數簽名的解決方案:
class Foo {
func timer() {
(self as AnyObject).performSelector(#selector(Foo.print))
}
@objc func print() {
NSLog("print")
}
}
let instance = Foo()
instance.timer()
可能與Objective-C API橋接有關,仍在調查......
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.