- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想弄清楚 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 中有一个元素?
最佳答案
NSMapTable
的weak
行为选项在您不关心何时 键/值被释放时最有效,而是您确实关心注意键/值不会被强烈保留,并且在感兴趣的对象变为 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/
我想弄清楚 NSMapTable 是如何工作的所以我在 Playground 上尝试以下代码: class Person { var name: String init(name: S
我正在尝试使用 NSMapTable 弱存储一些对象实例,由字符串索引。 (我的用例是存储一些有关远程服务器的缓存元数据,并让每个事件客户端共享该元数据。当没有客户端连接到该特定服务器时,应从内存中删
我有一个从弱到强的NSMapTable。当我尝试调用 removeObjectForKey:method 时,我的应用程序崩溃了。 代码如下:self.requestedObjectMap是一个从弱到
我想保留一个可变数组,其中包含对一组UIViews 的weak 引用。 NSMapTable 非常适合这种需求,除了一个细节...... NSMapTable 需要一个键来表示它所拥有的每个值。 是否
NSMapTable 是否与 NSMutableDictionary 相同,只是允许键为指针? 它在内存管理上有什么不同吗? 最佳答案 NSMapTable 比 NSDictionary 更灵活。虽然
我正在 Swift 中尝试类似的方法,但没有用。错误是:Type()不符合类型BooleanType //visibleCollectionReusableHeaderViews is of type
当我使用NSMapTable时,一个麻烦让我不开心,我这样做了 [self.map setObject:block forKey:key] 在 obj-c 中是可以的,但是当我这样做的时候 map.s
在 Swift 的早期版本中,我的 NSMapTable 中的键可以是字符串: let mapTable = NSMapTable(keyOptions: .StrongMemory, valueOp
这个问题在这里已经有了答案: Declare "NSMapTable StrongObject" in Swift 3 (1 个回答) 关闭 6 年前。 以下行给我编译器错误“无法推断通用参数‘Ke
当我尝试在 swift 2.0 中使用 NSMapTable 时,似乎弱内存选项不起作用。这是我的测试代码: class TestClass { var a: String requi
如何在 Swift 3 中声明一个 NSMapTable?为什么 Apple 的这个示例不起作用? let activeLines = NSMapTable.strongToStrongObjects
我在 iOS 6 项目的许多地方使用了 NSMapTable,并且希望能够使用新的字典下标样式来访问对象。 (NSMapTable 的行为主要类似于 NSMutableDictionary,但可以为其
我是一名优秀的程序员,十分优秀!