使用self.performSelector

时间:2016-07-19 13:48:24

标签: swift swift-playground 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)

问题出在哪里?

2 个答案:

答案 0 :(得分:3)

尝试将Foo.print()更改为以下内容:

    @objc func print() -> AnyObject? {
        NSLog("print")
        return nil
    }

我相信代码也会在Playground运行。

performSelector的返回类型不是Void

- performSelector:

func performSelector(_ aSelector: Selector) -> Unmanaged<AnyObject>!

因此,Playground会尝试显示结果值。实际上并没有返回。

答案 1 :(得分:3)

这是一个不需要更改功能签名的解决方案:

class Foo {

    func timer() {
        (self as AnyObject).performSelector(#selector(Foo.print))
    }

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

let instance = Foo()
instance.timer()

可能与Objective-C API桥接有关,仍在调查......