Ios 为什么要保留对指针的引用?
我需要一个弱NSHashTable对象,如果一个对象变为零,我希望NSHashTable自动从其列表中删除该对象 代码如下:Ios 为什么要保留对指针的引用?,ios,swift,memory-management,Ios,Swift,Memory Management,我需要一个弱NSHashTable对象,如果一个对象变为零,我希望NSHashTable自动从其列表中删除该对象 代码如下: import Foundation class Router: NSObject { let listeners: NSHashTable<Listener> = NSHashTable.weakObjects() } class Listener: NSObject { } let router = Router() var listen
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)
有可能我不理解弱引用哈希表的主要用途吗?我之所以要这样做,是为了防止对象丢失所有强引用,这也会从哈希表中删除。您理解正确,但是计数获取程序有点混乱。在操场上查看以下内容。当您释放强引用时,您将看到该对象的deinit被调用,尽管它在NSHashTable中。但是,count方法似乎存在某种缓存问题。您可以改为使用allObjects.count,它返回正确的值,但对象仍然被正确释放。之后的调度是这样的,对象在下一个运行循环“frame”中肯定会被清除
before 1
after 1
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