当 class(层次结构的中间)被删除时,我们是否有保留周期?
Do we have a retention cycle when a class (middle of hierarchy) is removed?
情况:ClassA(祖父母class)保留classB(Parentclass)和classB(Parent class) 保留 class C(Child class) 然后如果我删除 class B 那么会发生什么, class A并且class C有一个保留周期并导致内存泄漏?
取决于你是如何删除 Class B.
If I removed class B then what would happen
你这是什么意思?如果您使用的是 ARC,则不应调用 release
。那么你是如何删除 class B 的呢?
因为ClassA持有对classB的强引用,classB的retain count是1,现在只能带上[=41的reference count =] B 为 0 并让 ARC 清理 Class B 是通过将 Class B 的强引用设置为 nil。
所以,如果在你的 class A 中,如果你说,
self.classBReference = nil;
然后 Class B 的引用计数变为 0,显然 class B 被释放,因为 Class B 被释放,class C 的引用计数变为 0 因为 Class C 被 class B 强烈持有,class B 不再存在。因此 Class C 现在成为被 ARC 删除的候选人。
概念验证:
这是我的class声明
class A {
var binstance : B? = B() //Declared as optional because I need to set the reference to nil later :)
deinit {
print("A deinited")
}
}
class B {
var cinstance = C()
deinit {
print("B deinited")
}
}
class C {
deinit {
print("C deinited")
}
}
现在我在 VC 中创建了 Class A 的实例,因此 A、B 和 C 的引用计数都为 1。
var ainstance : A = A()
当我将实例设置为 nil 时,这里是调用顺序
self.ainstance.binstance = nil
O/P
B 已取消
C deinited
情况:ClassA(祖父母class)保留classB(Parentclass)和classB(Parent class) 保留 class C(Child class) 然后如果我删除 class B 那么会发生什么, class A并且class C有一个保留周期并导致内存泄漏?
取决于你是如何删除 Class B.
If I removed class B then what would happen
你这是什么意思?如果您使用的是 ARC,则不应调用 release
。那么你是如何删除 class B 的呢?
因为ClassA持有对classB的强引用,classB的retain count是1,现在只能带上[=41的reference count =] B 为 0 并让 ARC 清理 Class B 是通过将 Class B 的强引用设置为 nil。
所以,如果在你的 class A 中,如果你说,
self.classBReference = nil;
然后 Class B 的引用计数变为 0,显然 class B 被释放,因为 Class B 被释放,class C 的引用计数变为 0 因为 Class C 被 class B 强烈持有,class B 不再存在。因此 Class C 现在成为被 ARC 删除的候选人。
概念验证:
这是我的class声明
class A {
var binstance : B? = B() //Declared as optional because I need to set the reference to nil later :)
deinit {
print("A deinited")
}
}
class B {
var cinstance = C()
deinit {
print("B deinited")
}
}
class C {
deinit {
print("C deinited")
}
}
现在我在 VC 中创建了 Class A 的实例,因此 A、B 和 C 的引用计数都为 1。
var ainstance : A = A()
当我将实例设置为 nil 时,这里是调用顺序
self.ainstance.binstance = nil
O/P
B 已取消
C deinited