我正在分析一个avfoundation视频编码程序。帧写入时内存增加。在我添加了autoreleasepool之后,问题就消失了。
@autoreleasepool {
NSString *inputFramePath = self.inputFramePaths[self.currentFrameIndex++];
self.currentFrame = [UIImage imageWithContentsOfFile:inputFramePath];
CVPixelBufferRef buffer = (CVPixelBufferRef)[VideoExporter newPixelBufferFromCGImage:self.currentFrame.CGImage size:self.resolution];
if (buffer) {
[self.adaptor appendPixelBuffer:buffer withPresentationTime:self.nextPTS];
CVPixelBufferRelease(buffer);
self.nextPTS = CMTimeAdd(self.frameDuration, self.nextPTS);
}
}
没有autoreleasepool:
使用autoreleasepool:
我还不太清楚autoreleasepool,有人能解释一下我的代码到底发生了什么吗?我是否需要批量编写帧而不是为每个帧排空池?
答案 0 :(得分:1)
当您自动释放对象时,它会被添加到自动释放池中。通常添加到的池是一个在堆栈中创建的池,并作为运行循环的一部分(对于在主线程上为您创建的池)排出,或者当线程退出时(当您在开始一个线程)
通过在其他位置创建自动释放池,其范围内的自动释放对象在该池耗尽时释放,而不是等待现有池消耗。如果在循环中处理大量数据,这可以大大降低内存使用的高水位。
通过一组图像处理可能是这种用例之一。在你的情况下,我猜你的代码示例是一个循环的一部分,一次处理几个帧。
只要保留自动释放池之外所需的所有对象,就可以安全使用。
请务必阅读有关自动释放池的Advanced Memory Management Programming Guide部分。