我有一个父类和一个子类。父级对子级有强引用,子级对父级有无主引用。在父母的 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
}
不幸的是,doStuff()
在父进程的 deinit 期间调用会导致崩溃,因为它使用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 尚未完成。然而这个错误似乎表明孩子不能再访问它对unowned
父母的引用。
任何人都可以对此有所了解吗?