2

我正在试验 NSProgress,在后台线程上找到一个简单的循环会导致内存快速增长:

class Worker {
    var progress:NSProgress?

    func doWork() {
        let numIterations:Int64 = 100000
        let delay:UInt32 = 100

        let progressObj = NSProgress(totalUnitCount: numIterations)
       // progressObj.cancellable = true
        progress = progressObj


        let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT

        dispatch_async(dispatch_get_global_queue(priority, 0)) {
            progressObj.becomeCurrentWithPendingUnitCount(numIterations)
            for i in 0...numIterations {
                progressObj.completedUnitCount = i
                usleep(delay)
            }

            progressObj.resignCurrent()
        }

    }

}

使用 Allocations 工具对此进行分析显示内存在 30 秒内增长到约 20mb(如果我增加循环的大小,则更多)。分配都归于_NSProgressFraction.

有什么明显的我忽略了,或者这是 NSProgress 的一个错误?

4

1 回答 1

4

经过更多的实验,看起来设置的行为progressObj.completedUnitCount会导致 NSProgress 将分配到当前的自动释放池中。我发现我可以通过将循环体包装在自动释放池中来防止内存增长,如下所示:

for i in 0...numIterations {
    autoreleasepool {
        progressObj.completedUnitCount = i
        usleep(delay)
    }
}    
于 2016-02-14T05:45:40.140 回答