在帧写入循环中有和没有autoreleasepool的内存占用,为什么?

时间:2013-07-29 04:26:21

标签: objective-c automatic-ref-counting objective-c-blocks instruments nsautoreleasepool

我正在分析一个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:

enter image description here

使用autoreleasepool:

enter image description here

我还不太清楚autoreleasepool,有人能解释一下我的代码到底发生了什么吗?我是否需要批量编写帧而不是为每个帧排空池?

1 个答案:

答案 0 :(得分:1)

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

通过在其他位置创建自动释放池,其范围内的自动释放对象在该池耗尽时释放,而不是等待现有池消耗。如果在循环中处理大量数据,这可以大大降低内存使用的高水位。

通过一组图像处理可能是这种用例之一。在你的情况下,我猜你的代码示例是一个循环的一部分,一次处理几个帧。

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

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