我想使用NSExpression
评估动态生成的数学表达式。当我运行下面的简单程序时,内存消耗很快就会达到1 GB甚至更多。
我显然是在泄露记忆,或者我使用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 :(得分:1)
内存不会泄漏,但是基础方法就像
expressionValue()
可以返回&#34;自动释放&#34;对象(甚至可能
在内部创建更多自动释放的对象)。
这些仅在当前自动释放池结束时释放
(例如,当执行返回到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?和 &#34;高级内存管理编程指南&#34;。
中的Using Autorelease Pool Blocks