2016-10-31 1 views
1

Я хочу оценить динамически генерируемые математические выражения, используя NSExpression. Когда я запускаю простую программу ниже, потребление памяти быстро суммируется до 1 ГБ и более.Ошибка утечки памяти NSExpression?

Я, очевидно, теряю память или что-то не так с тем, как я использую 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 для каждой итерации внешнего цикла.

+0

Попробуйте использовать авторизованный пул: http://stackoverflow.com/questions/25860942/is-it-necessary-to-use-autoreleasepool-in-a-swift-program. –

ответ

1

память не течет, но Фундаментные методы, как expressionValue() может вернуть «autoreleased» объект (и может даже создавать более autoreleased объекты внутри). Они выдаются только тогда, когда текущий пул авторезистов заканчивается (например, когда выполнение возвращается к основному циклу событий в приложении 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? и Using Autorelease Pool Blocks в «Руководстве по программированию управления расширенной памятью».