Ign*_*ioC 2 retaincount retain-cycle swift
我想我知道Swift上的保留周期是什么以及它为什么会产生内存泄漏.但我写了一个小例子来演示它,似乎代码正确地解除了分配.
在这个例子中,我有两个相互保留的对象(创建保留周期),第三个对象强有力地保持两者.
我希望第三个对象也不可能解除分配,但事实并非如此.
相互保留的两个对象:
class Obj1: NSObject {
var objc2: Obj2?
deinit {
print("Obj1 Deinit")
}
}
class Obj2: NSObject {
var obj1: Obj1?
deinit {
print("Obj2 Deinit")
}
}
Run Code Online (Sandbox Code Playgroud)
容器:
class Container {
var obj1: Obj1?
var obj2: Obj2?
deinit {
print("Container Deinit")
}
}
Run Code Online (Sandbox Code Playgroud)
生成保留周期的代码
let obj1 = Obj1()
let obj2 = Obj2()
obj1.objc2 = obj2
obj2.obj1 = obj1
let c = Container()
c.obj1 = obj1
c.obj2 = obj2
Run Code Online (Sandbox Code Playgroud)
控制台上的结果是:
Container Deinit
Run Code Online (Sandbox Code Playgroud)
有人可以指出为什么Container即使它的属性不被解除分配?
有人可以指出为什么
Container即使它的属性不被解除分配?
容器的属性仍然有其他所有者是无关紧要的.对容器唯一重要的是对容器有多少强引用.
在您的示例中,只有一个对容器的强引用,常量c:
let c = Container()
Run Code Online (Sandbox Code Playgroud)
当c超出范围时(在程序/操场的末尾),容器对象被释放,并且由于没有其他强引用,因此取消分配.
(旁白:容器的释放反过来导致容器释放其对其属性的强引用,obj1并且obj2.但由于对这些对象的其他强引用仍然存在,所以它们不会被解除分配,正如您正确指出的那样.)