HTML5   发布时间:2022-04-27  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了ios – Swift Dictionary荒谬的内存使用大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我在我的一个应用程序中遇到了一个有趣的问题.多次访问字典时,我的应用程序的内存使用量在几秒钟内就会超过一千兆字节.以下是一些显示问题的示例代码.

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字符串就像这样修复了问题:

let nsKey = "key1"

将字典更改为NSDictionary还可以解决此问题:

let Dictionary: NSDictionary = ["key1":"value1"]

有谁知道为什么使用铸造的NSString访问字典会导致如此多的堆分配,除了上面描述的那些之外还有其他任何修复吗?

这是一些照片.看起来幕后的字符串被分配并设置为自动释放(或者我是否正在读取下面的数据错误?)这可能是为什么内存使用会不断分配然后在以后耗尽?如果这是真的,这应该被视为“错误”吗? OS X和iOS上都会出现此问题.

ios – Swift Dictionary荒谬的内存使用

ios – Swift Dictionary荒谬的内存使用

解决方法@H_772_35@
最好的解决方案是不要在这里桥接到NSString.只需使用Swift类型.或者,正如您所发现的,您可以使用Foundation类型(NSString和NSDictionary).桥接可能需要制作临时副本.

但是,在任何情况下,在这样的循环中,出于某种原因创建临时副本是非常常见的(即使您避免了这个特定问题).要解决这个问题,您需要在循环中消耗自动释放池.例如:

let Dictionary = ["key1":"value1"]
let nsKey: NSString = "key1"
let swiftKey = nsKey as String
for _ in 0 ... 10000000 {
    autoreleasepool {         // <=== the scope of the current pool
        DictionarY[swiftKey]
    }
}

添加它将使您的记忆保持稳定.这在Cocoa的大循环中是很常见的事情.否则,在从顶级方法返回之前,池不会被耗尽.

大佬总结

以上是大佬教程为你收集整理的ios – Swift Dictionary荒谬的内存使用全部内容,希望文章能够帮你解决ios – Swift Dictionary荒谬的内存使用所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。