我有一個父類和一個子類。父母對孩子有很強的參考,孩子對父母有一個無與倫比的參考。在父母的DEINIT,我希望孩子做一些清理,並涉及調用父:子對象在父對象的初始化期間是否可以引用其父對象?
class ViewController: UIViewController
{
override func viewDidLoad()
{
super.viewDidLoad()
let parent = Parent()
}
}
class Parent : NSObject
{
override init()
{
super.init()
child.doStuff()
}
deinit
{
child.doStuff()
}
lazy private var child : Child = Child(parent : self)
}
class Child : NSObject
{
init(parent : NSObject)
{
self.parent = parent
}
func doStuff()
{
println(self.parent)
}
deinit
{
}
private unowned var parent : NSObject
}
不幸的是,母公司的DEINIT過程中調用doStuff()
導致系統崩潰,因爲它使用self.parent
:
libswiftCore.dylib`_swift_abortRetainUnowned:
0x111e91740 <+0>: leaq 0x1e6cd(%rip), %rax ; "attempted to retain deallocated object"
0x111e91747 <+7>: movq %rax, 0x58612(%rip) ; gCRAnnotations + 8
0x111e9174e <+14>: int3
-> 0x111e9174f <+15>: nop
據我所知,父母應該仍然存在,因爲父母的deinit尚未完成。然而,這個錯誤似乎表明,孩子不能再訪問其父母的引用。
任何人都可以對此有所瞭解嗎?
你能告訴我們你是如何在你的情況下調用'deinit'嗎? – Unheilig
我已經添加了'viewDidLoad'來顯示父級的init/deinit的上下文。 – JimmyB