【问题标题】:Why does this Swift code leak memory, and how do I handle it?为什么这个 Swift 代码会泄漏内存,我该如何处理?
【发布时间】:2016-03-10 04:52:52
【问题描述】:

这段 Swift 代码(基于 Stack Overflow 上的另一篇文章)计算一千万个 MD5 哈希值(为了这个例子,对它们什么都不做)。但是 md5() 函数会泄漏内存;运行时间越长,消耗的内存就越多:

import Foundation

func md5(string: String) -> [UInt8] {
    var digest = [UInt8](count: Int(CC_MD5_DIGEST_LENGTH), repeatedValue: 0)
    if let data = string.dataUsingEncoding(NSUTF8StringEncoding) {
        CC_MD5(data.bytes, CC_LONG(data.length), &digest)
    }
    return digest
}

for var i = 0; i < 10000000; i++ {
    let hash = md5(String(format:"%u", i))
}

这个 md5() 函数消耗内存而不是自动释放它的原因是什么?我可以/应该在代码中做些什么来释放它不再需要的内存?

【问题讨论】:

    标签: swift memory memory-leaks md5


    【解决方案1】:

    可能md5 函数正在创建自动释放的对象。试试这个:

    for var i = 0; i < 10000000; i++ {
        autoreleasepool {
            let hash = md5(String(format:"%u", i))
        }
    }
    

    【讨论】:

    • 成功了;非常感谢!我将autoreleasepool 放入md5 函数本身;只要我在其中包含“if”语句,我就不再泄漏内存。我还不明白是什么在吞噬内存,但我会担心的。
    • dataUsingEncoding(_:) 是一个 Foundation 方法(在 Objective-C 中实现),它返回一个自动释放的对象。
    猜你喜欢
    • 2011-10-21
    • 1970-01-01
    • 2020-03-28
    • 2011-01-17
    • 1970-01-01
    • 2016-04-12
    • 2013-04-27
    相关资源
    最近更新 更多