2015-06-14 75 views
0

我有一個框架,回調在AppDelegate方法使用的NSThreaddetachNewThreadSelector:,這看起來是這樣的:NSThread detachNewThreadSelector:崩潰只在發行版本在Xcode 7 +雨燕2.0

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當框架的類被初始化時。

該應用程序在調試版本中運行時沒有問題,但是當上述內容在發佈版本中被調用時會立即崩潰。 (當我關閉發佈版本的優化時,它也崩潰了。)

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

編輯 -我最終使用closure而不是detachNewThreadSelector:。適用於兩種版本。

回答

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.

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 
      ) 
     }) 
    } 
} 
+0

無法使用類型爲'(String,toTarget:AnyObject,withObject:String?「)的參數列表調用'detachNewThreadSelector'' –

+0

'您可以顯示崩潰登錄? –

+0

異常類型:EXC_BAD_INSTRUCTION(SIGILL) 異常代碼:0x0000000000000001,0x0000000000000000 異常備註:EXC_CORPSE_NOTIFY –