Xcode8 Beta EXC_BAD_ACCESS 创建弱引用时出现错误
Xcode8 Beta EXC_BAD_ACCESS Error appears when creates weak references
以下代码复制自Weak References section of the Official document
class Person {
let name: String
init(name: String) { self.name = name }
var apartment: Apartment?
deinit { print("\(name) is being deinitialized") }
}
class Apartment {
let unit: String
init(unit: String) { self.unit = unit }
weak var tenant: Person?
deinit { print("Apartment \(unit) is being deinitialized") }
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john //Error!
基本描述了person
类型实例和Apartment
类型实例之间的强弱引用关系(请看下图)
但是,当我运行代码时,我得到了一个错误。
问题:如何解决?
Mr.Alessandro Orrù 的回复,(我又复制粘贴了一遍还是报错)
这现在可以正常工作了 - 该错误已在 XCode 8 GM Seed 中修复。
原答案:
这是 playgrounds 或 XCode8 beta 3 中的错误。我复制了您的代码,尝试了 Apple 示例,并尝试将其减少到最低限度:
class A { var b:B? }
class B { weak var a:A? }
let b = B()
let a = A()
a.b=b
b.a=a
在 XCode 7.3.1 和 Swift 2.2 中,所有工作都按预期进行。 XCode 8 beta 3 和 Swift 3 全部失败。错误是:
error: Playground execution aborted: error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=EXC_I386_GPFLT).
它只适用于游乐场 - 在应用程序中没问题。 (我尝试了 Mac OS 命令行程序)
以下代码复制自Weak References section of the Official document
class Person {
let name: String
init(name: String) { self.name = name }
var apartment: Apartment?
deinit { print("\(name) is being deinitialized") }
}
class Apartment {
let unit: String
init(unit: String) { self.unit = unit }
weak var tenant: Person?
deinit { print("Apartment \(unit) is being deinitialized") }
}
var john: Person?
var unit4A: Apartment?
john = Person(name: "John Appleseed")
unit4A = Apartment(unit: "4A")
john!.apartment = unit4A
unit4A!.tenant = john //Error!
基本描述了person
类型实例和Apartment
类型实例之间的强弱引用关系(请看下图)
但是,当我运行代码时,我得到了一个错误。
问题:如何解决?
Mr.Alessandro Orrù 的回复,(我又复制粘贴了一遍还是报错)
这现在可以正常工作了 - 该错误已在 XCode 8 GM Seed 中修复。
原答案:
这是 playgrounds 或 XCode8 beta 3 中的错误。我复制了您的代码,尝试了 Apple 示例,并尝试将其减少到最低限度:
class A { var b:B? }
class B { weak var a:A? }
let b = B()
let a = A()
a.b=b
b.a=a
在 XCode 7.3.1 和 Swift 2.2 中,所有工作都按预期进行。 XCode 8 beta 3 和 Swift 3 全部失败。错误是:
error: Playground execution aborted: error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=EXC_I386_GPFLT).
它只适用于游乐场 - 在应用程序中没问题。 (我尝试了 Mac OS 命令行程序)