【发布时间】:2016-06-04 12:42:18
【问题描述】:
我在我的一个应用程序中遇到了一个有趣的问题。当多次访问Dictionary 时,我的应用程序的内存使用量会在几秒钟内飙升至 1 GB 以上。下面是一些显示问题的示例代码。
override func viewDidLoad() {
let dictionary = ["key1":"value1"]
let nsKey: NSString = "key1"
let swiftKey = nsKey as String
for _ in 0 ... 10000000 {
dictionary[swiftKey]
}
}
重复访问字典会导致内存攀升,直到循环结束。我查看了工具并看到了大量的字符串分配。原来使用 NSString 是问题所在。
像这样将 nsKey 更改为 swift String 可以解决问题:
let nsKey = "key1"
将字典更改为 NSDictionary 也解决了这个问题:
let dictionary: NSDictionary = ["key1":"value1"]
有谁知道为什么使用强制转换的 NSString 访问字典会导致如此多的堆分配,除了上面描述的之外,还有其他修复方法吗?
这里有一些图片。看起来幕后字符串正在被分配并设置为 autorelease (或者我读错了下面的数据?)这可能是内存使用量不断分配然后在稍后耗尽的原因吗?如果这是真的,这应该被认为是一个“错误”吗?在 OS X 和 iOS 上都会出现此问题。
【问题讨论】:
标签: ios swift macos performance dictionary