嗯...
我对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没有给我提示)。
任何想法,什么操作都可能引发这种行为?我没有循环引用,至少我没有看到它们。
答案 0 :(得分:0)
好的,修好了。问题是,我的“A”类被URLSession(作为委托)作为参考。由于此会话未正确终止,因此A对象未被初始化。