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 秒間で約 20 MB に増加することがわかります (ループのサイズを大きくすると、さらに増加し​​ます)。割り当てはすべて に起因し_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 に答える