我遇到了一些奇特而有趣的事情,并且很想从任何人那里获得意见。所以首先让我们来定义这个类:
class TestClass:NSObject {
var s1 = NSHashTable<TestClass>(options: .weakMemory)
func doit(bla:TestClass) {
s1.add(bla)
bla.s1.add(self)
}
deinit {
print("Deinit")
}
}
现在让我们考虑以下内容:
var t1:TestClass? = TestClass()
var t2:TestClass? = TestClass()
如果我们做了以下 deinit 被调用:
t1?.s1.add(t2!)
t2?.s1.add(t1!)
t1 = nil // This will result in deinit being called
现在让我们做同样的事情,但通过调用 doit() 方法
t1?.doit(bla:t2!)
t1 = nil // Deinit doesn't get called for some reason
这里的问题是为什么在这种情况下不调用 deinit ?这有什么不同,因为它本质上与第一种方法具有相同的引用分配?
我很想得到任何人的意见。