嗯..。
我在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没有给我任何提示)。
你知道什么操作会引起这种行为吗?我没有循环引用,至少我看不到它们。
发布于 2017-11-19 20:56:22
好了,修复了。问题是,我的"A“类被一个URLSession (作为委托)作为引用持有。由于此会话未正确终止,因此A对象未取消初始化。
https://stackoverflow.com/questions/47372355
复制相似问题