我读过 How to demonstrate memory leak and zombie objects in Xcode Instruments?但那是针对 objective-c 的。这些步骤不适用。
来自阅读here我知道僵尸是这样的对象:
- 解除分配
- 但某些指针仍在尝试指向它们并向它们发送消息。
不确定这与访问已释放的对象有何不同。
我的意思是在 Swift 中你可以这样做:
var person : Person? = Person(name: "John")
person = nil
print(person!.name)
人被释放了吗?是的!
我们是否试图指向它?是的!
那么有人可以分享导致创建悬挂指针的最常见错误吗?
最佳答案
下面是 15 行以下代码的僵尸攻击:
class Parent { }
class Child {
unowned var parent: Parent // every child needs a parent
init(parent: Parent) {
self.parent = parent
}
}
var parent: Parent? = Parent()
let child = Child(parent: parent!) // let's pretend the forced unwrap didn't happen
parent = nil // let's deallocate this bad parent
print(child.parent) // BOOM!!!, crash
这段代码中发生的事情是 Child
持有对 Parent
的无主引用,一旦 Parent
被释放,它就变得无效。该引用包含一个指向不再存在的父级 (RIP) 的指针,并且访问它会导致崩溃并显示类似于以下的消息:
Fatal error: Attempted to read an unowned reference but object 0x1018362d0 was already deallocated2018-10-29 20:18:39.423114+0200 MyApp[35825:611433] Fatal error: Attempted to read an unowned reference but object 0x1018362d0 was already deallocated
注意该代码无法在 Playground 中运行,为此您需要一个常规应用。
关于swift - 如何在 Swift 中演示僵尸对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53049678/