- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用 NSMapTable
弱存储一些对象实例,由字符串索引。
(我的用例是存储一些有关远程服务器的缓存元数据,并让每个事件客户端共享该元数据。当没有客户端连接到该特定服务器时,应从内存中删除元数据。)
这一切都很好,只要我从不重复键。看起来,如果我迭代了一个特定的键,该键的值将永远不会被释放。
我已经设法将其简化为显示问题的一小段代码:
import Foundation
class Foobar {
let id: String
init(_ id: String) { print("init \(id)"); self.id = id }
deinit { print("deinit \(id)") }
}
let map = NSMapTable<NSString, Foobar>(keyOptions: .strongMemory, valueOptions: .weakMemory)
func addSome() {
let a = Foobar("a")
let b = Foobar("b")
let c = Foobar("c")
map.setObject(a, forKey: "a")
map.setObject(b, forKey: "b")
map.setObject(c, forKey: "c")
let e = map.keyEnumerator()
print("nextObject: \(e.nextObject() ?? "nil")")
print("nextObject: \(e.nextObject() ?? "nil")")
print("nextObject: \(e.nextObject() ?? "nil")")
print("nextObject: \(e.nextObject() ?? "nil")")
}
addSome()
print(map.object(forKey: "a") ?? "nil")
print(map.object(forKey: "b") ?? "nil")
print(map.object(forKey: "c") ?? "nil")
如果我注释掉一个或多个 e.nextObject()
调用,相应键的值将被正确释放,并且 map.object(forKey:)
将正确返回 nil
。
我是否必须在以某种方式完成枚举器后手动清理它?
最佳答案
显然, map 枚举器返回“自动释放”对象——当当前自动释放池的范围离开时,这些对象将被释放。
在 iOS 或 macOS 应用程序中,当程序控制返回主事件循环时会自动发生。在任何情况下,您都可以使用本地 autorelease pool
autoreleasepool {
let e = map.keyEnumerator()
print("nextObject: \(e.nextObject() ?? "nil")")
print("nextObject: \(e.nextObject() ?? "nil")")
print("nextObject: \(e.nextObject() ?? "nil")")
print("nextObject: \(e.nextObject() ?? "nil")")
}
在枚举后立即释放对象。
备注: NSEnumerator
是一个Sequence
,因此您可以用for循环枚举它:
autoreleasepool {
let e = map.keyEnumerator()
for case let key as String in e {
print(key)
}
}
关于ios - 迭代 NSMapTable 中的键永远保留弱值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56405398/
我想弄清楚 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,但可以为其
我是一名优秀的程序员,十分优秀!