代码之家  ›  专栏  ›  技术社区  ›  Chris Edgington

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

  •  1
  • Chris Edgington  · 技术社区  · 7 年前

    我在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!
    }
    

    当这个循环运行时,内存使用量将稳定地clime,有时会达到~300MB,一旦完成,它似乎不会被释放。

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

    1 回复  |  直到 7 年前
        1
  •  6
  •   vacawama    7 年前

    我怀疑你的问题是 String 在您的例程结束并且autoreleasepool被清空之前不会释放。试着把你的内环包起来 autoreleasepool { } 要提前释放这些值:

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