在 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”