0

我正在分析一个 avfoundation 视频编码程序。内存随着帧的写入而增加。添加自动释放池后,问题就消失了。

        @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,有人可以解释一下我的代码中到底发生了什么吗?我是否需要批量写入帧而不是为每一帧耗尽池?

4

1 回答 1

1

当你自动释放一个对象时,它会被添加到一个自动释放池中。通常,添加到的池是在堆栈中创建的池,并作为运行循环的一部分(对于在主线程上为您创建的池)或线程退出时(当您在线程的开始)

通过在其他地方创建自动释放池,其作用域内的自动释放对象会在该池耗尽时被释放,而不是等待现有的对象耗尽。在循环处理大量数据的情况下,这可以显着降低内存使用的高水位线。

通过一组图像进行处理可能是这样的用例之一。就您而言,我猜您的代码示例是一次处理多个帧的循环的一部分。

只要保留自动释放池之外需要的所有对象,就可以安全使用。

请务必阅读Advanced Memory Management Programming Guide关于自动释放池的部分。

于 2013-07-29T05:38:52.503 回答