NSThread detachNewThreadSelector:仅在 Xcode 7 + Swift 2.0 的发布版本中崩溃

NSThread detachNewThreadSelector: Crash only in release build in Xcode 7 + Swift 2.0

我有一个框架可以使用 detachNewThreadSelector:AppDelegate 回调方法 [=31] =]NSThread,看起来像这样:

private func bridgeSelector(selector: String?, object: String?) {
        if selector != nil && responder != nil {
            dispatch_async(dispatch_get_main_queue(), {
                NSThread.detachNewThreadSelector(Selector(
                    selector!),
                    toTarget: self.responder!,
                    withObject: object
                )
            })
        }
    }

respondervar分配给selfAppDelegate 当框架的 class 被初始化时。

应用程序 运行 在调试版本中没有问题,但如果它在发布版本中,则在调用上述程序时立即崩溃。 (当我在发布版本中关闭优化时它也崩溃了。)

我正在使用 Xcode 7 beta 和 Swift 2.0。 (我知道它是测试版,但它是唯一支持 Swift 2 的测试版。)

编辑 - 我最终使用闭包而不是 detachNewThreadSelector:。适用于两个版本。

尝试在此处添加 respondsToSelector: 检查。它很脏,但是类似的东西。我相信它很脏

func bridgeSelector(selector: String?, object: String?) {
    if let r = responder, let sel = selector where
        r.respondsToSelector(Selector(sel))
    {
        dispatch_async(dispatch_get_main_queue(), {
            NSThread.detachNewThreadSelector(
                Selector(sel),
                toTarget: r,
                withObject: object
            )
        })
    }
}

我用来替换上面的解决方案是使用Closure

在框架的class中,我声明了一个闭包变量:

class FrameworkClass {

    public var methodOfAnotherClass: ((sender: AnyObject?) -> ())?

    func asyncMethod() {
        // Done with the work.
        let msg = "From Russia, with love."
        methodOfAnotherClass!(sender: msg)
    }
}

然后主要class:

class main {

    func bond(objectFromRussia: AnyObject?) {
        if let msg = objectFromRussia as? String {
            Swift.print(msg)
        }
    }

    func callMeMaybe() {
        let aFrameworkClassObject = FrameworkClass()
        aFrameworkClassObject.methodOfAnotherClass = bond
        aFrameworkClassObject.asyncMethod()
    }

}

调用 callMeMaybe: 时,控制台应打印 From Russia, with love.