ios - 为什么 NSHashTable 保持对指针的引用?

标签 ios swift memory-management

我需要一个对象的弱 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/

相关文章:

ios - 渲染 60 张图像导致内存警告

ios - 在 Swift 中访问自定义 UITableViewCell UILabel 文本会引发错误

iphone - 图片不会加载到UIImageView iPhone应用程序中

ios - 如何用断点导航器中的定义替换 NSUncaughtExceptionHandler?

c - 结构内的指针重新分配正常,但指向结构内指针的指针无法重新分配,并出现无效指针错误

c - PeekInt、PokeInt、Peek、Poke 等效于 BASIC 中的 C

objective-c - 跨平台 iOS/Mac OS X Objective-C 开发?

swift - 通过组件从 NSDate 获取小时数

ios App(Swift) 本地化

c - 内存中的程序及其内存映射