ios - NSExpression内存泄漏?

标签 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

最佳答案

内存不会泄漏,但是像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/

相关文章:

Swift:当前 View Controller 在转换到下一个 View Controller 期间重新显示

ios - Xcode Storyboard变灰

objective-c - Mac OS X 中的自动布局和调整 View 大小

objective-c - 无法从类外访问 UIView 的 "center"属性

ios - 在 iPhone 中以编程方式从另一个应用程序打开 iCloud 设置

ios - 在 AppDelegate 中对初始 ViewController 使用强委托(delegate)

r - 在 macOS 上使用 RStudio 安装 RSymphony

ios - 带有 xib 的 CustomTableViewCell。我无法将标签连接到自定义状态表单元格

ios - swift 仅满足某些要求时如何进入另一个segue?

ios - 依赖于另一个 ios 框架项目的 podspec