swift - 在 Swift 中减少循环期间的内存使用

标签 swift

我在 Swift 中有一个 while 循环试图解决一个问题,有点像比特币挖矿。一个简化版本是 -

import SwiftyRSA

func solveProblem(data: String, complete: (UInt32, String) -> Void) {
    let root = data.sha256()
    let difficulty = "00001"
    let range: UInt32 = 10000000
    var hash: String = "9"
    var nonce: UInt32 = 0
    while (hash > difficulty) {
        nonce = arc4random_uniform(range)
        hash = (root + String(describing: nonce)).sha256()
    }
    complete(nonce, hash)
}

solveProblem(data: "MyData") { (nonce, hash) in
    // Problem solved!
}

虽然此循环正在运行,但内存使用量会稳步上升,有时会达到 ~300mb,并且一旦完成,它似乎就不会被释放。

有人能解释为什么会这样吗?这是否是我应该担心的事情?

最佳答案

我怀疑您的问题是您正在创建大量的 String,这些字符串在您的例程结束并且自动释放池被清空之前不会被释放。尝试将内部循环包装在 autoreleasepool { } 中以更早地释放这些值:

while (hash > difficulty) {
    autoreleasepool {
        nonce = arc4random_uniform(range)
        hash = (root + String(describing: nonce)).sha256()
    }
}

关于swift - 在 Swift 中减少循环期间的内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50668015/

相关文章:

swift - 在 Swift 3 的函数范围之外附加变量

ios - 根据 RLMArray 属性的大小查询所有对象的 Realm ?

ios - 如何在不执行任何操作的情况下刷新用户界面

swift - 如何更快速地转置数组?

ios - 联系人访问权限显示在模拟器中,但有时不会显示在真实设备上

objective-c - swift 中的 func "self"导致 Xcode 中出现错误

ios - UITableViewCell 约束错误

ios - url.isFileReferenceURL() 在 IOS 中为本地文件返回 false

ios - 如何将控制权从一个手势识别器传递给另一个

ios - 在 TextView 中添加新文本时如何保留删除线?删除线跳转到最新突出显示的单词