内存泄漏:CGDataProviderCreateWithCopyOfData

4
我使用UIImage+Resize库在拍摄后直接调整图像大小。
以下代码会导致内存泄漏:
CGContextDrawImage(UIGraphicsGetCurrentContext(), CGRectMake(0, 0, srcSize.width, srcSize.height), imgRef);
UIImage* resizedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

使用Instruments工具时,CGDataProviderCreateWithCopyOfData函数会造成内存泄漏问题。

根据其他StackOverflow的帖子,在代码中加入@autoreleasepool语句也无法解决该问题。


CGDataProviderCreateWithCopyOfData 的意思只是你泄漏的东西是图像,而这就是你创建图像的地方。一切都取决于你在其他地方如何处理 resizedImage。Instruments 不会告诉你错误出在哪里,它只会告诉你内存分配的位置。 - Rob Napier
你找到代码哪里有问题了吗?我也遇到了同样的问题。 - Xvolks
1个回答

2

注意:您可能已经解决了问题,这个答案是给未来遇到同样问题的读者准备的。

我已经找出了自己实现(使用GPUImage进行视频分析)中发生了什么。

我需要在调用CGBitmapContextCreateImage的代码周围添加一个autoreleasepool闭包(它还调用CGDataProviderCreateWithCopyOfData)。

    func run() {
        while (parent != nil) {
            if semaphore.acquireSemaphore(5000) {
                autoreleasepool { // Without this I was leaking images until crash.
                    parent?.analyseImage(self.sampleBuffer!, lineFinder:finder) //This calls CGBitmapContextCreateImage
                }
            }
        }
        thread = nil
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接