2016-10-31 276 views
1

我想使用NSExpression來評估動態生成的數學表達式。當我運行下面的簡單程序時,內存消耗快速總計高達1 GB或更多。NSExpression內存泄漏?

我明顯是內存泄漏還是有什麼問題,我使用的方式NSExpression

#!/usr/bin/env swift 

import Foundation 

for _ in 1...100 { 

    let expressionString = "((x - y) * ((x * x) - (((x - y) * -1) - y))) + (x * (((x * (y - x)) - x) * -1))" 
    let expression = NSExpression(format: expressionString) 

    for x in 0 ..< 320 { 
     for y in 0 ..< 320 { 
      let result = expression.expressionValue(with: ["x" : x, "y": y], context: nil) as! Double 
     } 
    } 
} 

在真正的程序,當然,我創建了一個新的expressionString用於外部循環的每次迭代。

+0

嘗試使用autorelease池:http://stackoverflow.com/questions/25860942/is-it-necessary-to-use-autoreleasepool-in-a-swift-program。 –

回答

1

內存不會泄漏,但Foundation方法(如 和expressionValue())可以返回「自動釋放」對象(甚至可能在內部創建更多自動釋放對象)。 這些僅在當前自動釋放池結束 時(例如,當執行返回到Cocoa/Cocoa Touch應用程序中的主事件循環時)纔會釋放。

默認情況下,命令行應用程序沒有自動釋放池 。您可以添加一個來控制自動發佈的對象的生命週期。例如:

for x in 0 ..< 320 { 
    autoreleasepool { 
     for y in 0 ..< 320 { 
      let result = expression.expressionValue(with: ["x" : x, "y": y], context: nil) as! Double 
     } 
    } 
} 

你必須要弄清楚哪個環路層面把池(以 平衡內存消耗與執行時間)。

另請參閱「高級內存管理編程指南」中的Is it necessary to use autoreleasepool in a Swift program?Using Autorelease Pool Blocks