【问题标题】:iOS Swift: Calling a singleton method 3 times causes app to crashiOS Swift:调用单例方法 3 次导致应用程序崩溃
【发布时间】:2015-03-16 17:25:22
【问题描述】:

我有并排的目标/快速代码。我正在调用 swift 单例方法 3 次。三遍后就崩溃了。我有理由相信这可能是内存问题。这是我的代码

ViewController.m

-(void)sharedData
{
    // called three times
    sharedData = [SharedData sharedData];
    [sharedData initSyncManager];
}

Swift sharedData 类

class func sharedData() -> SharedData 
{
    struct Singleton 
    {
        static let instance = SharedData()
    }
    return Singleton.instance
}

func initSyncManager()
{

}

此行的错误是 EXC_BAD_ACCESS (code=EXC_i386_GPFLT)

'return Singleton.instance'

我不知道为什么会这样。我在initSyncManager 中根本没有代码,只有在我使用这段代码时才会发生这种崩溃

[sharedData initSyncManager];

如果我不调用该方法 3 次,则不会发生崩溃。

【问题讨论】:

  • 我认为您在创建单例时遇到了问题,请阅读此code.martinrue.com/posts/the-singleton-pattern-in-swift
  • 我尝试了提供的单例,但遗憾的是它没有工作。
  • 单例的最佳实现:一点也不。我是认真的。退一步问自己:“它真的需要单例吗?”,例如我不再使用它们,我只是传入创建视图控制器期间需要的任何对象或通过属性传递它。为什么?因为单例很容易搞砸你的测试和内存。

标签: ios objective-c swift singleton


【解决方案1】:

你可以试试这个,因为我正在使用它(在 Swift 2.1 中)创建单例类,它对我来说很好:

class var sharedInstance: SharedData {
    struct Static {
        static var onceToken: dispatch_once_t = 0
        static var instance: SharedData? = nil
    }
    dispatch_once(&Static.onceToken) {
        Static.instance = SharedData()
    }
    return Static.instance!
}

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

【讨论】:

    【解决方案2】:

    我认为您的单例语法不像您期望的那样工作,并且每次实例化都会创建一个新实例。每次实例化时,您都会调用 static let instance = SharedData()(“给我一个共享数据的新实例”)然后返回它。

    试试这个:

    private let _SharedData = SharedData()
    
    class SharedData {
        class var instance: SharedData {
            return _SharedData
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-05
      • 2020-03-17
      相关资源
      最近更新 更多