访问NSUserDefaults时发布版本的Swift崩溃

访问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 =

我正在尝试获取/存储NSUserDefaults中的[String:Int]信息。除非我使用发布版构建,否则工作正常。然后我在isEqual上得到一个崩溃:。这里的代码非常普通:

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,崩溃消失了。猜测编译器需要被明确地告知该做什么