【问题标题】:Loading contents of a plist crashes one out of "many" times when running在运行时加载 plist 的内容会导致“多次”崩溃
【发布时间】:2018-05-11 02:58:59
【问题描述】:

我有一个加载 plist 内容的函数:

func loadSecretDataFromPlist() -> [String: String]? {
    if let path = Bundle.main.path(forResource: "SecretData", ofType: "plist") {
        if let commonDict = NSDictionary(contentsOfFile: path) {
            return (commonDict as! [String : String])
        }
    }

    return nil
}

然后我有一个单例类,它调用这个函数来加载这个数据:

final class ClassA {
    static var sharedInstance = ClassA()
    var secretData = loadSecretDataFromPlist()!
    // ... more functions and stuff below
}

大多数时候(如 19/20),它会按预期运行。但时不时会导致应用在函数的第 4 行崩溃,即return (commonDict as! [String: String])

控制台错误为Failed to inherit CoreMedia permissions from 49868: (null) (lldb)

不太清楚为什么或如何发生这种情况:/

【问题讨论】:

    标签: ios swift xcode dictionary plist


    【解决方案1】:

    我会懒惰地初始化secretData 并使用PropertyListSerialization

    final class ClassA {
    
        static let sharedInstance = ClassA()
    
        lazy var secretData : [String:String] = {
            let url = Bundle.main.url(forResource: "SecretData", withExtension: "plist")!
            let data = try! Data(contentsOF: url)
            return try! PropertyListSerialization.propertyList(from: data, format: nil) as! [String:String]
        }()
    }
    

    好处是数据在第一次访问属性时读取一次

    【讨论】:

    • 由于是单例,调用函数时数据不是还读取一次吗?
    • 不,单例本身是延迟加载的,但这种行为不会影响secretData。试试看:添加print
    猜你喜欢
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多