Постепенная утечка памяти в цикле по содержанию QTMovie

У меня есть простой инструмент основы, который экспортирует каждый кадр фильма как .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;

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

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

[Вырезанная ссылка для замедления, поскольку это, кажется, не такая большая проблема, как я думал.]

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

Тест 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 вызывается.

1
задан wildplasser 26 October 2011 в 15:35
поделиться

1 ответ

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

1
ответ дан 2 September 2019 в 23:42
поделиться