Высокая отладка памяти с помощью Apple Instruments - PullRequest
0 голосов
/ 01 июля 2019

У меня есть приложение, написанное на swift, которое изначально отлично работает, но со временем приложение становится вялым.Я открыл сеанс профилирования инструментов, используя профиль Allocation and Leaks.

Что я обнаружил, так это то, что распределение резко увеличивается, делая что-то, что должно только перезаписывать текущие данные.

enter image description here

Указанная память находится в группе <не объект>

enter image description here

Открытие этой группы дает сотни различных распределений, причем ответственной библиотекой является libvDSP.Итак, с этим я могу заключить, что это вызов vDSP, который не освобождает память должным образом.Однако двойной щелчок по любому из них не дает мне никакого кода, но необработанный язык я не понимаю.

enter image description here

Функция, к которой относится callas vDSP, выглядит следующим образом:

func outOfPlaceComplexFourierTransform(
    setup: FFTSetup,
    resultSize:Int,
    logSize: UInt,
    direction: FourierTransformDirection) -> ComplexFloatArray {

    let result = ComplexFloatArray.zeros(count:resultSize)

    self.useAsDSPSplitComplex { selfPointer in
        result.useAsDSPSplitComplex { resultPointer in
            vDSP_fft_zop(
            setup,
            &selfPointer,
            ComplexFloatArray.strideSize,
            &resultPointer,
            ComplexFloatArray.strideSize,
            logSize,
            direction.rawValue)
        }
    }
    return result
}

Вызывается из другой функции:

var mags1 = ComplexFloatArray.zeros(count: measurement.windowedImpulse!.count)
    mags1 = (measurement.windowedImpulse?.outOfPlaceComplexFourierTransform(setup: fftSetup, resultSize: mags1.count, logSize: UInt(logSize), direction: ComplexFloatArray.FourierTransformDirection(rawValue: 1)!))!

Внутри этой функции mags1 управляется и перезаписывает существующий массив.Насколько я понимаю, mags1 будет освобожден после завершения этой функции, поскольку он доступен только внутри этой функции.

Эта функция вызывается много раз в секунду.Любая помощь будет оценена, так как то, что занимает всего 5 МБ, очень быстро увеличивается на двести мегабайт за пару секунд.

Буду признателен за любые указатели для дальнейшего изучения источника утечки или для правильного освобождения этой памяти после ее завершения.

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Не могу поверить, что я так быстро решил эту проблему после публикации.(У меня действительно было несколько часов, чтобы выдернуть мои волосы).

Не включенный в мой код здесь, я создавал новый FFTSetup каждый раз, когда это вызывалось.Очевидно, что это интенсивно использует память, и она не использовала эту память повторно.

В приборах, смотрящих на дерево вызовов, я смог увидеть функцию, использующую эту память.

enter image description here

0 голосов
/ 01 июля 2019

проверьте, если вы используете

lazy

также убедитесь, что ваши делегаты имеют класс и слабый тип, как это protocol Delegate: class{} weak var delegate: Delegate? У меня была такая же проблема в моих проектах, и я устранил эту проблему выше.

...