我正在试验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的一个bug?
发布于 2016-02-14 13:45:40
经过更多的实验,看起来设置progressObj.completedUnitCount的行为会导致NSProgress在当前的自动释放池中进行分配。我发现我可以通过在自动释放池中包装循环体来防止内存增长,如下所示:
for i in 0...numIterations {
autoreleasepool {
progressObj.completedUnitCount = i
usleep(delay)
}
} https://stackoverflow.com/questions/35386209
复制相似问题