NSExpression内存泄漏?

时间:2016-10-31 08:32:49

标签: ios swift macos cocoa memory-leaks

我想使用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

1 个答案:

答案 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