访问NSUserDefaults时发布版本的Swift崩溃
我正在尝试获取/存储NSUserDefaults中的[String:Int]信息。除非我使用发布版构建,否则工作正常。然后我在isEqual上得到一个崩溃:。这里的代码非常普通:访问NSUserDefaults时发布版本的Swift崩溃,swift,nsuserdefaults,Swift,Nsuserdefaults,我正在尝试获取/存储NSUserDefaults中的[String:Int]信息。除非我使用发布版构建,否则工作正常。然后我在isEqual上得到一个崩溃:。这里的代码非常普通: private func storeVersion(storeName: String) -> UInt64 { let settings = NSUserDefaults.standardUserDefaults() let versions: [String:Int] if let dict =
private func storeVersion(storeName: String) -> UInt64 {
let settings = NSUserDefaults.standardUserDefaults()
let versions: [String:Int]
if let dict = settings.dictionaryForKey(storeVersionKey) as? [String:Int] {
versions = dict
} else {
versions = [ storeName : 0 ]
settings.setObject(versions, forKey: storeVersionKey)
settings.synchronize()
}
if let version = versions[storeName] {
return UInt64(version)
}
return 0
}
private func setStoreVerion(storeName: String, version: UInt64) {
let settings = NSUserDefaults.standardUserDefaults()
var versions: [String:Int]
if let dict = settings.dictionaryForKey(storeVersionKey) as? [String:Int] {
versions = dict
} else {
versions = [:]
}
versions[storeName] = Int(version)
settings.setObject(versions, forKey: storeVersionKey)
settings.synchronize()
}
我读到的所有东西都说这个应该很好用。但是,我只在发布版本中遇到以下崩溃:
0
Crashed: com.apple.main-thread
EXC_BAD_ACCESS KERN_INVALID_ADDRESS at 0x0000000027f5beb8
raw
0
libobjc.A.dylib
objc_msgSend + 16
isEqual:
1
CoreFoundation
CFEqual + 452
2
CoreFoundation
-[CFPrefsPlistSource alreadylocked_setValue:forKey:] + 192
3
CoreFoundation
-[CFPrefsSource setValue:forKey:] + 76
4
CoreFoundation
+[CFPrefsSource withSourceForIdentifier:user:byHost:container:perform:] + 860
5
CoreFoundation
_CFPreferencesSetValueWithContainer + 248
6
Foundation
-[NSUserDefaults(NSUserDefaults) setObject:forKey:] + 56
7
PersistenceLayer
_TF16PersistenceLayer11UpdateStoreFTSS9toVersionVSs6UInt64_T_ + 2264
第7行是指该代码:
public func UpdateStore(storeName: String, toVersion version: UInt64) {
if storeVersion(storeName) >= version {
return
}
DeleteStoreNamed(storeName)
setStoreVerion(storeName, version)
}
需要注意的几件事:
我只复制了堆栈跟踪的一部分,其余都是启动例程
第7行调用storeVersion,首先检查版本,然后有条件地更新该版本。更新时发生崩溃。
DeleteStoreNamed_uu使用NSFileManager简单地删除两个db文件。没别的了。
这是在主线程上
此代码包含在嵌入式框架模块中。
这是目前Swift 1.2尚未迁移到2.0的版本
显然,问题在于我对[String:Int]的使用。在我尝试使用发布版本配置之前,这一切都很好。优化过程的某些方面没有将类型转换为objective-c可以使用的类型。在我将对象提交给NSUserDefaults之前,通过显式地将类型更改为NSDictionary,崩溃消失了。猜测编译器需要被明确地告知该做什么