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