gpt4 book ai didi

ios - NSMapTable 是如何工作的

转载 作者:搜寻专家 更新时间:2023-10-31 22:40:57 25 4
gpt4 key购买 nike

我想弄清楚 NSMapTable 是如何工作的所以我在 Playground 上尝试以下代码:

class Person {
var name: String


init(name: String ) {
self.name = name
print("\(name) is being initialized")
}

deinit {
print("\(name) is being deinitialized")
}
}

var hobyePerson : NSMapTable? = NSMapTable<Person, NSMutableString>
(keyOptions: .weakMemory, valueOptions: .weakMemory)

var rob : Person? = Person(name: "Rob Appleseed") // print : Rob Appleseed is being initialized

hobyePerson?.setObject("golf", forKey: rob)
hobyePerson?.count // return : 1


rob = nil // print : Rob Appleseed is being deinitialized
hobyePerson?.count // return : 1 (WHY ???!!!!)

写在documentation :“键和/或值可以选择“弱”保留,以便在回收其中一个对象时删除条目。”

为什么即使我初始化了对象,以便在释放 rob 时它对键值对具有弱引用,我仍然在 hobyePerson 中有一个元素?

最佳答案

NSMapTableweak 行为选项在您不关心何时 键/值被释放时最有效,而是您确实关心注意键/值不会被强烈保留,并且在感兴趣的对象变为 nil 之后的某个时间点将被释放

为什么会这样?

作为基础类,NSMapTable 的作者必须在特性和性能之间取得平衡。

因此,作为性能的“优化”,他们选择不立即从映射表中删除变为 nil 的弱引用对象...!相反,这会在可以高效完成时“稍后”发生——例如当映射表在内部调整大小时等。

正如@Luke 在他的回答中也提到的那样,请参阅这篇关于对 NSMapTable 的行为进行的实验的优秀文章,了解更多详细信息:

http://cocoamine.net/blog/2013/12/13/nsmaptable-and-zeroing-weak-references/

关于ios - NSMapTable 是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46982265/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com