这个Swift代码应该产生内存泄漏,但事实并非如此.有人能指出原因吗?

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即使它的属性不被解除分配?

Ole*_*ann 5

有人可以指出为什么Container即使它的属性不被解除分配?

容器的属性仍然有其他所有者是无关紧要的.对容器唯一重要的是对容器有多少强引用.

在您的示例中,只有一个对容器的强引用,常量c:

let c = Container()
Run Code Online (Sandbox Code Playgroud)

c超出范围时(在程序/操场的末尾),容器对象被释放,并且由于没有其他强引用,因此取消分配.

(旁白:容器的释放反过来导致容器释放其对其属性的强引用,obj1并且obj2.但由于对这些对象的其他强引用仍然存在,所以它们不会被解除分配,正如您正确指出的那样.)