При получении метаданных из медиа-файлов у меня возникла проблема с памятью, которую я не могу выяснить.
Я хочу получить метаданные для медиа-файлов, хранящихся в локальном хранилище приложений или в области 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 завершает работу и приложение возвращается в нормальное состояние, вся память снова освобождается.
Итак, в заключение, это не настоящая утечка, а серьезная проблема. Есть хорошие идеи относительно того, что идет не так? Есть ли способ заставить управление памятью выполнить очистку?