在 Swift 字典中重置值时崩溃

Posted

技术标签:

【中文标题】在 Swift 字典中重置值时崩溃【英文标题】:Crash when resetting value in Swift dictionary 【发布时间】:2014-11-27 22:15:35 【问题描述】:

我一直在 Xcode 中使用 Swift 编程语言,我相信我遇到了一个错误,只是我不完全确定。当我编译并运行以下程序时:

import Foundation

typealias GeneratorCallback = () -> AnyObject?
typealias NamedGenerators = [String: GeneratorCallback]

var generators = NamedGenerators()

class ValueResetter 
  let name: String
  let originalValue: AnyObject?

  init(name: String, value: AnyObject?) 
      self.name = name
      originalValue = generators[self.name]?()
      println("The original value is \(originalValue)")
      generators[self.name] =  value 
  

  deinit 
      println("Resetting \(self.name) to \(self.originalValue)")
      generators[self.name] =  self.originalValue 
  


func applyAndResetValue(name: String, value: AnyObject?) 
  let resetter = ValueResetter(name: name, value: value)
  println("The value is \(generators[name]?())")


let valueName = "Value"
applyAndResetValue(valueName, 1)
println("The value is \(generators[valueName]?())")

applyAndResetValue(valueName, 2)
println("The value is \(generators[valueName]?())")

它会输出:

The original value is nil
The value is Optional(1)
Resetting Value to nil
The value is nil
The original value is nil
The value is Optional(2)
Resetting Value to nil

然后在第二次调用 deinit 时崩溃,并出现 EXC_BAD_ACCESS 错误。 人们对这次崩溃的原因了解多少?

【问题讨论】:

我得到了以下信息:The original value is nil The value is Optional(1) Resetting Value to nil 0 swift 0x0000000102dd0a68 swift(17510,0x7fff77f06300) malloc: *** error for object 0x7fdc21e77588: incorrect checksum for freed object - object was probably modified after being freed. *** set a breakpoint in malloc_error_break to debug Abort trap: 6 【参考方案1】:

这里应该有编译错误,但实际上没有。您在对象的 deinit 中强烈捕获对象。换句话说:

deinit 
    println("Resetting \(self.name) to \(self.originalValue)")
    generators[self.name] =  self.originalValue 

捕获当前正在取消初始化的self

将 deinit 更改为此修复崩溃:

deinit 
    let value: AnyObject? = self.originalValue
    println("Resetting \(self.name) to \(value)")
    generators[self.name] =  value 

【讨论】:

以上是关于在 Swift 字典中重置值时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 13 上同步更新线程内的发布值时,Swift 崩溃

由于该应用程序崩溃,字典得到 nil 值。在展开可选值时意外发现 nil

嵌套的 JSON 数据将导致使用 NS 字典(在 Swift 中)崩溃

Obj-C 框架返回 nil,并让我的 Swift 代码崩溃,说“致命错误:在展开可选值时意外发现 nil”

Obj-C 框架返回 nil,并让我的 Swift 代码崩溃,说“致命错误:在展开可选值时意外发现 nil”

Swift 中的 CLPlacemark 崩溃