Постепенная утечка памяти в цикле по содержимому QTMovie - PullRequest
1 голос
/ 17 июня 2010

У меня есть простой инструмент основания, который экспортирует каждый кадр фильма в виде файла .tiff. Вот соответствующий код:

NSString* movieLoc = [NSString stringWithCString:argv[1]];
QTMovie *sourceMovie = [QTMovie movieWithFile:movieLoc error:nil];
int i=0;

while (QTTimeCompare([sourceMovie currentTime], [sourceMovie duration]) != NSOrderedSame) {
    // save image of movie to disk  
    NSAutoreleasePool *arp = [[NSAutoreleasePool alloc] init];

    NSString *filePath = [NSString stringWithFormat:@"/somelocation_%d.tiff", i++];
    NSData *currentImageData = [[sourceMovie currentFrameImage] TIFFRepresentation];
    [currentImageData writeToFile:filePath atomically:NO];
    NSLog(@"%@", filePath);

    [sourceMovie stepForward];
    [arp release];
}

[pool drain];
return 0;

Как вы можете видеть, мы создаем и уничтожаем автозапуск при каждом запуске цикла, который должен удалять различные автоматически выпущенные объекты, созданные при каждом запуске.

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

[Отредактировано упоминание о замедлении, так как это не такая большая проблема, как я думал.]

Редактировать: Давайте выберем некоторые части кода внутри цикла и посмотрим, что мы узнаем ...

Тест 1

while (banana) {
    NSAutoreleasePool *arp = [[NSAutoreleasePool alloc] init];
    NSString *filePath = [NSString stringWithFormat:@"/somelocation_%d.tiff", i++];
    NSLog(@"%@", filePath);

    [sourceMovie stepForward];
    [arp release];
}

Здесь мы просто перебираем весь фильм, создавая имя файла и регистрируя его.

Использование памяти : стабильные 15 МБ на время.

Тест 2

while (banana) {
    NSAutoreleasePool *arp = [[NSAutoreleasePool alloc] init];
    NSImage *image = [sourceMovie currentFrameImage];

    [sourceMovie stepForward];
    [arp release];
}

Здесь мы добавляем обратно при создании NSImage из текущего кадра.

Использование памяти: постепенно увеличивается. RSIZE составляет 60 МБ в кадре 200; 75 МБ от f300.

Тест 3

while (banana) {
    NSAutoreleasePool *arp = [[NSAutoreleasePool alloc] init];
    NSImage *image = [sourceMovie currentFrameImage];
    NSData *imageData = [image TIFFRepresentation];

    [sourceMovie stepForward];
    [arp release];
}

Мы добавили обратно в создание объекта NSData из NSImage.

Использование памяти: постепенно увеличивается. 62 МБ на F200; 75 МБ на F300. Другими словами, в значительной степени идентичны.

Полагаю, это небольшая утечка памяти в базовой системе, используемой QTMovie при вызове currentFrameImage.

Ответы [ 2 ]

1 голос
/ 29 декабря 2011

Была такая же проблема.Попробуйте локальный пул автоматического выпуска в цикле.Это помогло в моем случае.Смотрите здесь: http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmAutoreleasePools.html

1 голос
/ 17 июня 2010

Самый простой способ обнаружить утечку памяти - запустить вашу программу под профилировщиком.XCode включает в себя отличные инструменты профилирования, один из которых вам нужен находится в Run-> Start with Performance Tool-> Leaks.Он также довольно прост в использовании.

...