Memory Swift-未调用Denit

Memory Swift-未调用Denit,memory,swift4,Memory,Swift4,嗯 我对Swif4内存管理中的意外行为有点问题。事实上,我错过了一个电话 代码部分的布局基本上如下所示: class A { init() { print("A init \(unsafeBitCast(self, to: UnsafeMutableRawPointer.self)) called") } deinit { print("A deinit \(unsafeBitCast(self, to: UnsafeMutableRaw

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

代码部分的布局基本上如下所示:

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(){
调用的打印(“一个init\(unsafeBitCast(self,to:UnsafeMutableRawPointer.self))
}
脱硝{
打印(“一个deinit\(unsafeBitCast(self,to:UnsafeMutableRawPointer.self))调用)
}
func c(){
打印(“称为c”)
}
}
B类{
变量a:a
init(){

a=a()确定,已修复。问题是,我的“a”类被URLSession(作为委托)作为引用保留。由于此会话未正确终止,a对象未被取消初始化。

确定,已修复。问题是,我的“a”类被URLSession(作为委托)作为引用保留。由于此会话未正确终止,A对象未被取消初始化。

可能是某个地方对B的引用…B正在支持URLSessionLegate协议…编辑:这很可能是由该协议引起的。如果我删除URLSessionLegate支持,则一切正常。Playerd或REPL(包括LLDB控制台)不是检查ARC相关行为的好地方。创建一个命令行工具或任何其他实际的应用程序项目来测试您的代码。对。我只是使用Playdy来演示(我自己)正确的预期行为。请参阅下面我的答案。可能是对B的引用…B支持URLSessionDelegate协议…编辑:这很可能是由此引起的。如果我删除URLSessionDelegate支持,一切都很好。Playerd或REPL(包括LLDB控制台)不是检查ARC相关行为的好地方。请创建一个命令行工具或任何其他实际应用程序项目来测试您的代码。对。我只是使用Playerd来演示(我自己)正确的预期行为。请参见下面的答案。
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