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