我需要一个对象的弱 NSHashTable,万一一个对象变为 nil,我希望 NSHashTable 自动从它的列表中删除该对象。
代码如下:
import Foundation
class Router: NSObject {
let listeners: NSHashTable<Listener> = NSHashTable.weakObjects()
}
class Listener: NSObject {
}
let router = Router()
var listener1: Listener? = Listener()
router.listeners.add(listener1)
print("before", router.listeners.count)
listener1 = nil
print("after", router.listeners.count)
Anth 日志是:
before 1
after 1
有没有可能我不明白弱引用哈希表的主要用途?我想要这样做的原因是,万一该对象丢失了所有强引用,它也会从哈希表中删除。
最佳答案
你没看错,但是 count getter 有点乱。在 Playground 上查看以下内容。一旦释放强引用,您就会看到为该对象调用 deinit,尽管它在 NSHashTable 中。但是,计数方法似乎存在某种缓存问题。您可以改用 allObjects.count,它会返回正确的值,但无论如何都会正确释放对象。之后的分派(dispatch)是为了确保在下一个运行循环“框架”中清理对象。
import UIKit
import XCPlayground
XCPlaygroundPage.currentPage.needsIndefiniteExecution = true
class Listener: NSObject {
deinit {
print("deinit")
}
}
let listeners = NSHashTable<Listener>(options: .weakMemory)
var listener: Listener? = Listener()
listeners.add(listener)
print("count:\(listeners.count) allObjects.count\(listeners.allObjects.count)")
listener = nil
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
print("count:\(listeners.count) allObjects.count:\(listeners.allObjects.count)")
}
输出:
count:1 allObjects.count:1
deinit
count:1 allObjects.count:0
关于ios - 为什么 NSHashTable 保持对指针的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44711353/