执行关闭时EXC_BAD_ACCESS

时间:2017-03-22 08:35:28

标签: swift3

我想在延迟时间后执行闭包,但发生了运行时错误。我知道GCD可以更容易地做到这一点,但我想知道为什么。

感谢。

这是我的代码:

func perform(_ aClosure:@escaping ()->Void, afterDelay delay: TimeInterval) {
    self.perform(#selector(fire(closure:)), with: aClosure, afterDelay: delay)
}

func fire(closure:()->Void) {
    closure() // error
}

self.perform({ 
     print("closure do something... ...")
}, afterDelay: 2)

1 个答案:

答案 0 :(得分:2)

像所有人(包括你;>)所说,使用GCD。如果您出于某种原因坚持使用perform(_:with:afterDelay:),请尝试将closure参数的类型更改为Any

func fire(closure: Any)
{
    (closure as! ()->Void)()
}

有关详细信息,请参阅this thread。另外,来自“使用Swift with Cocoa和Objective-C(Swift 3.0.1)”中的section "id Compatibility"

  

Objective-C id类型由Swift导入为Any类型。在   编译时和运行时,编译器引入了通用桥接   传递Swift值或对象时的转换操作   Objective-C作为id参数。将id值导入Swift时   如果是Any,运行时会自动将桥接回复到其中任何一个   类引用或Swift值类型。

NSObject perform(_:​with:​after​Delay:​) API Reference

  

<强>一个选择
  一个Selector,用于标识要调用的方法。方法   不应该有一个重要的回报值,应该采取一个单一的   类型为id的参数,或者没有参数。