我希望使用NSExpression对动态生成的数学表达式进行评估。当我在下面运行这个简单的程序时,内存消耗的总和很快就达到了1GB甚至更多。
我显然是内存泄漏,还是使用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。
发布于 2016-10-31 09:23:14
内存不会泄漏,但是像expressionValue()这样的基金会方法可以返回一个“自动释放”对象(甚至可能在内部创建更多的自动释放对象)。这些只有在当前自动释放池结束时才会释放(例如,当执行返回到Cocoa/Cocoa应用程序中的主事件循环时)。
默认情况下,命令行应用程序没有自动释放池。您可以添加一个来控制自动释放对象的生存期。例如:
for x in 0 ..< 320 {
autoreleasepool {
for y in 0 ..< 320 {
let result = expression.expressionValue(with: ["x" : x, "y": y], context: nil) as! Double
}
}
}您必须弄清楚在哪个循环级别上放置池(以平衡内存消耗和执行时间)。
还请参阅“高级内存管理编程指南”中的是否有必要在Swift程序中使用自动释放池?和使用自动释放池块。
https://stackoverflow.com/questions/40338759
复制相似问题