【发布时间】:2021-10-05 02:51:54
【问题描述】:
我读过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)
人被释放了吗?是的!
我们是否试图指向它?是的!
那么有人可以分享导致创建悬空指针的最常见错误吗?
【问题讨论】:
-
在 Swift 中我不会担心这一点。只要确保你不使用强制解包选项(我只将它们用于
IBOutlets),你不会有问题。 -
这正是我的想法。这here 是否适用:假设您有一个缓存,其条目是从某个 URL 下载的 NSData 实例,其中 URL 在 URL 中包含会话 ID,并且会话 ID + URL 用作查看的键缓存中的东西。现在,假设用户注销,导致会话 ID 被破坏。如果缓存中没有删除特定于该会话 ID 的所有条目,那么所有这些 NSData 对象都将被丢弃
-
请注意,您提供的 Swift 示例不是悬空指针的示例——您将引用设置为
nil,这意味着您不再拥有对该对象的引用,无论是否仍然分配。在 Swift 中获取悬空指针的最简单示例可能是使用Unmanaged,例如class C {}; var c = C(); Unmanaged.passUnretained(c).release()。c现在是一个悬空指针。不过,这不是一个“常见错误”——而且如果不使用这种不安全的结构,你永远无法在 Swift 中获得悬空指针(因为 Swift 默认情况下是安全的)。 -
也就是说,目前有一个不带临时指针转换的footgun,可以创建悬空指针,例如
let ptr = UnsafePointer([1, 2, 3])–ptr是一个悬空指针,因为数组到指针的转换只产生一个指针在通话期间有效。希望在github.com/apple/swift/pull/20070 中对此类转换发出警告(并最终出错)。 -
糟糕:*带有临时指针转换
标签: swift memory-management nszombie dangling-pointer