我想我知道什么不是一个保留周期是迅速和为什么它会产生内存泄漏。
但我编写了一个小示例来演示它,而且代码似乎已经正确地释放了。
在这个例子中,我有两个对象彼此保留(创建保留循环),第三个对象强烈地保留了这两个对象。
我也希望第三个对象不可能被释放,但事实并非如此。
两个相互保留的对象:

class Obj1: NSObject {
    var objc2: Obj2?
    deinit {
        print("Obj1 Deinit")
    }
}

class Obj2: NSObject {
    var obj1: Obj1?
    deinit {
        print("Obj2 Deinit")
    }
}

容器:
class Container {
    var obj1: Obj1?
    var obj2: Obj2?
    deinit {
        print("Container Deinit")
    }
}

生成保留周期的代码
let obj1 = Obj1()
let obj2 = Obj2()

obj1.objc2 = obj2
obj2.obj1 = obj1


let c = Container()
c.obj1 = obj1
c.obj2 = obj2

控制台上的结果是:
Container Deinit

有人能指出为什么Container被取消分配,即使它的属性不是?

最佳答案

有人能指出为什么Container被取消分配,即使它的属性不是?
容器的属性仍然有其他所有者,这无关紧要。对于容器来说,唯一重要的是存在多少对容器的强引用。
在您的示例中,只有一个对容器的强引用,即常量

let c = Container()

c超出范围(在程序/游乐场的末尾)时,容器对象将被释放,并且由于没有其他强引用,因此将被释放。
(除此之外:容器的释放反过来导致容器释放对其属性的强引用,cobj1。但是,由于对这些对象的其他强引用仍然存在,因此它们不会被释放,正如您正确指出的那样。)

关于swift - 这个Swift代码应该产生内存泄漏,但事实并非如此。有人能指出原因吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50965338/

10-13 09:04