swift - EXC_BAD_ACCESS 使用 self.performSelector

标签 swift swift-playground performselector

这是一个简单的学术而非真正的代码。

我想使用 performSelector 函数运行打印方法。但是如果我在 Playground 上运行这段代码,就会抛出异常:

EXC_BAD_ACCESS (code=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

- performSelector:

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

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

关于swift - EXC_BAD_ACCESS 使用 self.performSelector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38460490/

相关文章:

ios - 使用 MapKit 计算 3 个或更多地址之间的距离

swift - 更改 SKTileMapNode 的位置不会更改其行和列的位置

ios - Xcode Playground 不执行功能

swift - 在 Swift 中找不到结构类型的成员 <方法名称>

iphone - 使用 Objective c 在后台调用类方法

objective-c - "performSelector may cause a leak"泄漏时的替代方案?

swift - dispatch_async 并快速从云端下载图像

json - 按年月的 Swift JSON 搜索日期格式?

swift - 在 web View 中加载 url 的 MacOS 问题

iphone - 如何保证线程同步