【问题标题】:NSExpression memory leak?NSExpression内存泄漏?
【发布时间】:2017-03-13 08:01:19
【问题描述】:

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

【问题讨论】:

标签: ios swift macos cocoa memory-leaks


【解决方案1】:

内存没有泄漏,但 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 2013-01-20
    • 2011-10-31
    • 2019-08-10
    • 2013-06-24
    • 2011-03-22
    • 2015-04-20
    相关资源
    最近更新 更多