首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NSExpression内存泄漏?

NSExpression内存泄漏?
EN

Stack Overflow用户
提问于 2016-10-31 08:32:48
回答 1查看 58关注 0票数 1

我希望使用NSExpression对动态生成的数学表达式进行评估。当我在下面运行这个简单的程序时,内存消耗的总和很快就达到了1GB甚至更多。

我显然是内存泄漏,还是使用NSExpression的方式有什么问题?

代码语言:javascript
复制
#!/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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-31 09:23:14

内存不会泄漏,但是像expressionValue()这样的基金会方法可以返回一个“自动释放”对象(甚至可能在内部创建更多的自动释放对象)。这些只有在当前自动释放池结束时才会释放(例如,当执行返回到Cocoa/Cocoa应用程序中的主事件循环时)。

默认情况下,命令行应用程序没有自动释放池。您可以添加一个来控制自动释放对象的生存期。例如:

代码语言:javascript
复制
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程序中使用自动释放池?使用自动释放池块

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40338759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档