2016-10-31 215 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