2016-10-31 3 views
1

NSExpressionを使用して動的に生成された数式を評価したいと考えています。以下のシンプルなプログラムを実行すると、メモリ消費量は1GB以上になります。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を作成します。 expressionValue()

+0

自動解放プールを使用してみてください:http://stackoverflow.com/questions/25860942/is-it-necessary-to-use-autoreleasepool-in-a-swift-program –

答えて

1

メモリは漏れないが、ファンデーションの方法は、「自動解放」オブジェクトを返すことができる(さらに 内部より自動解放オブジェクトを作成することができます)。 これらは、現在の自動解放プールが終了したときにのみ解放されます(たとえば、実行がCocoa/Cocoa Touchアプリケーションのメインイベントループに戻るとき) 。

コマンドラインアプリケーションには、デフォルトで の自動解放プールがありません。オートレリースされた オブジェクトのライフタイムを制御するために1つを追加することができます。たとえば:

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

あなたは(実行時間対 バランスメモリ消費に)プールを置くためにどのループレベルで把握する必要があります。

「Advanced Memory Management Programming Guide」のIs it necessary to use autoreleasepool in a Swift program?および Using Autorelease Pool Blocksも参照してください。