2015-11-16 12 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