我有類似下面的代碼,涉及事件的異步內容處理:的b
實例前:異步函數調用衝突
class A {
var foos: Set<Fooable>
}
protocol Fooable {
func bar()
}
class B {
var a: A
var foo: Foo!
init(a: A) {
self.a = a
}
func start() {
self.foo = Foo(self)
self.a.foos.insert(self.foo)
}
deinit {
<... *>
if self.foo != nil {
self.a.remove(self.foo)
}
}
class Foo: Fooable {
unowned let b: B
init(_ b: B) {
self.b = B
}
func bar() { <... #> }
}
}
我想,這應該是安全的代碼已經不存在了,它會清除對foo
的所有引用,因此引用Foo.b
不應該是一個問題。
不過,我從Foo.bar()
內的self.b
訪問出現此錯誤(在某些GCD隊列運行,而不是主):
exc_breakpoint(代碼= exc_i386_bpt子碼=爲0x0)
調試器顯示self.b
是完全正確的:不是零,所有的值都是它們應該是的。
但是,調試器還顯示,同時主線程正在忙於去初始化對應的B
;它在<... *>
中暫停,即在參考foo
之前可以從a
中刪除。所以對我來說self.b
在這個時候是一個不好的參考。
這似乎是不幸的時機 - 但我該如何消除這個崩潰的潛力?畢竟,我無法阻止異步調用bar()
!