Почему мое быстрое приложение «пропускает» память в AVAsset - PullRequest
0 голосов
/ 05 марта 2020

При получении метаданных из медиа-файлов у меня возникла проблема с памятью, которую я не могу выяснить.

Я хочу получить метаданные для медиа-файлов, хранящихся в локальном хранилище приложений или в области iTunes. Для этого я использую AVAsset. Зацикливаясь на этих файлах, я вижу, что потребление памяти постоянно растет. И не только немного. Это важно и приводит к остановке приложения, когда я перечисляю свою библиотеку iTunes на телефоне.

Кажется, проблема в доступе к свойству метаданных класса AVAsset. Я сузил до одной строки кода: «пусть meta = ass.metadata». Наличие этой строки кода (без каких-либо ссылок) заставляет приложение потреблять память. Я включил пример моей структуры кода.

func processFiles(_ files:Array)
{
  var lastalbum : String = ""
  var i         : Int    = 0
  for file in files
  {
    i += 1
    view.setProgressPosition(CGFloat(i)/CGFloat(files.count))
    lastalbum = updateFile(file.url,lastalbum,
    { (album,title,artist,composer) in
      view.setProgressNote(album,title,artist+" / "+composer)
    })
  }
}

func updateFile(_ url:URL,_ lastalbum:String,iPod:Bool=false,
                _ progress:(String,String,String,String) -> Void) -> String
{
  let ass = AVAsset(url:url)
  let meta = ass.metadata

  for item in meta
  {
    // Examine metadata
  }
  // Use metadata
  // Callback with status
}

Кажется, что память, выделенная в методе updateFile, сохраняется даже после завершения функции. Однако, как только функция processFile завершает работу и приложение возвращается в нормальное состояние, вся память снова освобождается.

Итак, в заключение, это не настоящая утечка, а серьезная проблема. Есть хорошие идеи относительно того, что идет не так? Есть ли способ заставить управление памятью выполнить очистку?

1 Ответ

0 голосов
/ 06 марта 2020

Как предлагается в комментарии к сообщению, решение для этого заключается в том, чтобы заключить указанный код c в блок 'autoreleasepool'. Я протестировал это как с небольшим набором локальных медиафайлов, так и с моей довольно большой медиатекой iTunes (70 ГБ). После реализации «autoreleasepool» накопление памяти устраняется.

func updateFile(_ url:URL,_ lastalbum:String,iPod:Bool=false,
                _ progress:(String,String,String,String) -> Void) -> String
{
  autoreleasepool
  {
    let ass = AVAsset(url:url)
    let meta = ass.metadata

    for item in meta
    {
      // Examine metadata
    }
    // Use metadata
    // Callback with status
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...