gpt4 book ai didi

objective-c - QTMovie 内容循环中的逐渐内存泄漏

转载 作者:行者123 更新时间:2023-12-03 17:07:50 25 4
gpt4 key购买 nike

我有一个简单的基础工具,可以将电影的每一帧导出为 .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 本身没有检测到任何内存泄漏,但对象跟踪显示某些通用数据 block 的大小正在增加。

[编辑掉对减速的引用,因为它似乎并不像我想象的那么严重。]

编辑:让我们删除循环内的部分代码,看看我们发现了什么...

测试 1

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

[sourceMovie stepForward];
[arp release];
}

这里我们只是循环播放整个电影,创建文件名并记录它。

内存使用量:持续时间稳定为 15MB。

测试 2

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

[sourceMovie stepForward];
[arp release];
}

这里我们添加了从当前帧创建 NSImage 的过程。

内存使用量:逐渐增加。 RSIZE 在第 200 帧时为 60MB; f300 为 75MB。

测试3

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

[sourceMovie stepForward];
[arp release];
}

我们添加了从 NSImage 创建 NSData 对象的功能。

内存使用量:逐渐增加。 f200 时为 62MB; f300 时为 75MB。换句话说,基本相同。

我的猜测是,当调用 currentFrameImage 时,QTMovie 使用的底层系统中存在轻微的内存泄漏。

最佳答案

查找内存泄漏的最简单方法是在分析器下运行程序。 Xcode 包含出色的分析工具,您需要的工具位于“运行”->“使用性能工具启动”->“泄漏”。使用起来也非常简单。

关于objective-c - QTMovie 内容循环中的逐渐内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3063114/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com