斯威夫特 - 没有被称为deinit

时间:2017-11-18 23:53:36

标签: memory swift4

嗯...

我对Swif4内存管理中的意外行为有一点问题。事实上我错过了一个deinit电话

基本上代码部分的布局失败是这样的:

class A {
    init() {
        print("A init \(unsafeBitCast(self, to: UnsafeMutableRawPointer.self)) called")
    }

    deinit {
        print("A deinit \(unsafeBitCast(self, to: UnsafeMutableRawPointer.self)) called")
    }

    func c() {
        print("A c called")
    }
}


class B {
    var a : A

    init() {

        a = A()   <-- required because a is not optional

    }

    func c() {
        a = A()
        a.c()
    }
}

var b = B()
b.c()
b.c()
b.c()

我在操场上模拟了这个(预期的)打印输出是这个(没有评论):

A init 0x000060c00000c540 called     <-- initial init
A init 0x000060c00000c800 called     <-- first b.c()
A deinit 0x000060c00000c540 called
A c called
A init 0x000060400000c4c0 called     <-- second b.c()
A deinit 0x000060c00000c800 called   
A c called
A init 0x000060400000c4a0 called     <-- third b.c()
A deinit 0x000060400000c4c0 called   
A c called

不幸的是,我的现实生活课程并不像这样。事实上他们就是这样:

A init 0x000060c00000c540 called     <-- initial init
A init 0x000060c00000c800 called     <-- first b.c()
A deinit 0x000060c00000c540 called
A c called
A init 0x000060400000c4c0 called     <-- second b.c()
A deinit 0x000060c00000c800 called   <-- missing!
A c called
A init 0x000060400000c4a0 called     <-- third b.c()
A deinit 0x000060400000c4c0 called   <-- missing!
A c called

所以,基本上只有第一个deinit出现,没有后续。我担心内存泄漏(虽然Instruments没有给我提示)。

任何想法,什么操作都可能引发这种行为?我没有循环引用,至少我没有看到它们。

1 个答案:

答案 0 :(得分:0)

好的,修好了。问题是,我的“A”类被URLSession(作为委托)作为参考。由于此会话未正确终止,因此A对象未被初始化。