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

时间:2015-06-14 16:02:09

标签: objective-c xcode macos swift nsthread

我有一个框架,使用 AppDelegate detachNewThreadSelector: 来回调 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
                )
            })
        }
    }

responder var self 中分配给AppDelegate时的框架&#39>班级被初始化了。

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

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

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

2 个答案:

答案 0 :(得分:0)

尝试在那里添加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
            )
        })
    }
}

答案 1 :(得分:0)

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

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

class FrameworkClass {

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

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

然后在主要课程中:

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.