【问题标题】:What could cause EXC_BREAKPOINT on Swift sharedInstance return什么可能导致 Swift sharedInstance 返回上的 EXC_BREAKPOINT
【发布时间】:2015-11-16 21:35:16
【问题描述】:

我在sharedInstance return Static.instance! 行发生以下崩溃:

EXC_BREAKPOINT 0x0000000100da42d8

在没有调试断点的 Ad Hoc 发布版本中发生了崩溃。 根据崩溃的调用堆栈sharedInstance在崩溃时应该已经存在(它首先在应用启动时调用,在按钮点击时发生崩溃)。

在装有 iOS 8.4.0 的 iPad Air 2 上发生崩溃,构建是在 Xcode 7.1.1 中使用 Swift 2.1 编译器编译的

App 本身(在启动时调用 sharedInstance)和 DataSource 类位于不同的模块中。难道是框架中的类与 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()
        ...
    }
...
}

【问题讨论】:

    标签: ios exception swift2 xcode7


    【解决方案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()
        ...
      }
      ...
    }
    

    【讨论】:

    • 谢谢,但我提供的语法可能是导致崩溃的原因吗?此外,使用您的语法,它不是可能导致不同行为的惰性实例化。
    • 属性被延迟实例化,来自文档:存储类型属性在首次访问时被延迟初始化。是的,我猜你的语法可能会导致崩溃
    • 该语法来自 Swift 0.* 那里,所以现在我认为问题正是与新的 Swift 单例方法过度同步。将查看是否有新的崩溃出现:)
    • 语法安全,不会崩溃。
    • 另外,问题可能在于存储类型属性同步于我在旧语法中使用的静态结构的可选变量。以及编译优化的展开与同步...
    猜你喜欢
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 2011-07-08
    • 2019-01-05
    • 1970-01-01
    • 2021-07-26
    • 1970-01-01
    • 2012-02-26
    相关资源
    最近更新 更多