Ios 为什么要保留对指针的引用?

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

我需要一个弱NSHashTable对象,如果一个对象变为零,我希望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)

有可能我不理解弱引用哈希表的主要用途吗?我之所以要这样做,是为了防止对象丢失所有强引用,这也会从哈希表中删除。

您理解正确,但是计数获取程序有点混乱。在操场上查看以下内容。当您释放强引用时,您将看到该对象的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