親クラスと子クラスがあります。親には子への強い参照があり、子には親への所有されていない参照があります。親の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
それでも、このエラーは、子が親への参照にアクセスできなくなったことを示唆しているようです。
誰でもこれに光を当てることができますか?