2015-11-16 15 views
-1

我有以下的碰撞與sharedInstancereturn Static.instance!行:什麼會引起EXC_BREAKPOINT上斯威夫特sharedInstance回報

EXC_BREAKPOINT 0x0000000100da42d8

事故發生在特設發佈版本里沒有調試斷點。 根據調用棧崩潰sharedInstance應該已經存在的崩潰時(它是第一次調用應用程序啓動時,碰撞發生在按鈕水龍頭)。

崩潰發生在iPad 2的空氣與iOS 8.4.0,建立與雨燕2.1的編譯器在Xcode 7.1.1

應用程序本身(在啓動呼叫sharedInstance)編制和數據源類都位於不同的模塊。難道是從類的框架與DataSource類靜態結構是不同的?

@objc public final class DataSource : NSObject 
{   
    public class var sharedInstance: DataSource 
    { 
     struct Static 
     { 
      static var instance: DataSource? 
      static var token: dispatch_once_t = 0 
     } 

     dispatch_once(&Static.token) 
      {() -> Void in 
       Static.instance = DataSource() 
      } 
     return Static.instance! 
    } 

    override init() 
    { 
     super.init() 
     ... 
    } 
... 
} 

回答

1

靜態單由GCD支持反正所以這是推薦的語法

@objc public final class DataSource : NSObject 
{ 
    class var sharedInstance : DataSource { 
    struct Static { 
     static let sharedInstance = DataSource() 
    } 
    return Static.sharedInstance 
    } 

    override init() 
    { 
    super.init() 
    ... 
    } 
    ... 
} 
+0

謝謝,但我能提供的語法是崩潰的原因是什麼?而且,用你的語法,這不是懶惰的實例化,它可能導致不同的行爲。 – DisableR

+1

該屬性是懶惰地實例化,從文檔:*存儲類型屬性懶惰初始化他們的第一次訪問*。是的,你的語法可能會導致崩潰,我猜 – vadian

+0

該語法來自Swift 0. *那裏,所以現在我想這個問題是完全與新的Swift方法單身過度同步。將看看如果新的崩潰到達:) – DisableR