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
)
})
}
}
responder
是var
分配给self
在AppDelegate
当框架的 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.
我有一个框架可以使用 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
)
})
}
}
responder
是var
分配给self
在AppDelegate
当框架的 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.