我想使用 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
。
最佳答案
内存不会泄漏,但是像Foundation这样的方法
expressionValue()
可以返回一个“自动释放”的对象(甚至可能
在内部创建更多自动释放的对象)。
这些仅在当前自动释放池结束时释放
(例如,当执行返回到 Cocoa/Cocoa Touch 应用程序中的主事件循环时)。
命令行应用程序没有自动释放池 默认。您可以添加一个来控制 autoreleased 的生命周期 对象。例如:
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在《高级内存管理编程指南》中。
关于ios - NSExpression内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40338759/