SLN SLN - 2 months ago 59
Swift Question

Xcode8 Beta EXC_BAD_ACCESS Error appears when creates weak references

The following code is copied from the 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!


It basically described the strong and weak reference relationship between a
person
type instance and an
Apartment
type instance (Please see the figure bellow)

enter image description here

However, when I run the code, I got an error.

Question: How can I fix it?

enter image description here

In reply of Mr. Alessandro OrrĂ¹, (I copy and pasted it again and it still gives me error)

enter image description here

Answer

This now works correctly - the bug has been fixed in XCode 8 GM Seed.

Original Answer:

It's a bug in playgrounds in or XCode8 beta 3. I copied your code, tried the Apple example, and tried reducing it to the minimum:

class A { var b:B? }

class B { weak var a:A? }

let b = B()
let a = A()

a.b=b
b.a=a

All work as expected with XCode 7.3.1 and Swift 2.2. All fail with XCode 8 beta 3 and Swift 3. The error is:

error: Playground execution aborted: error: Execution was interrupted, reason: EXC_BAD_ACCESS (code=EXC_I386_GPFLT).

It's in playgrounds only - it's fine in an app. (I tried a Mac OS command line program)