Memory leaks Xcode UIImage imageWithCGImage内存泄漏

Memory leaks Xcode UIImage imageWithCGImage内存泄漏,memory-leaks,core-graphics,Memory Leaks,Core Graphics,我已经在我的应用程序中启用了ARC,并注意到如果我创建大量图像,我的应用程序将崩溃。作为我调查的一部分,我创建了一个小项目,重现了可以发现的问题。示例项目代码的内容如下所示: int width = 10; int height = 10; uint8_t data[100]; while (true) { CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceGray(); CGContextRef context = CG

我已经在我的应用程序中启用了ARC,并注意到如果我创建大量图像,我的应用程序将崩溃。作为我调查的一部分,我创建了一个小项目,重现了可以发现的问题。示例项目代码的内容如下所示:

int width = 10;
int height = 10;
uint8_t data[100];

while (true)
{
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceGray();
    CGContextRef context = CGBitmapContextCreate(data, width, height, 8, width, colorspace, kCGBitmapByteOrderDefault | kCGImageAlphaNone);
    CGImageRef cgimage = CGBitmapContextCreateImage(context);

    // Remove this line and memory is stable, keep it and you lose 15-20 MB per second. Why?
    UIImage* uiimage = [UIImage imageWithCGImage:cgimage];

    CGImageRelease(cgimage);
    CGContextRelease(context);
    CGColorSpaceRelease(colorspace);
}
运行此代码时,Xcode中的侧栏将显示应用程序的总内存以每秒15-20 MB的速度增长。如果注释掉创建
UIImage
的行,则泄漏消失

关于堆栈溢出,有很多问题,关于在通过
imageWithCGImage
创建UIImage之后是否应该释放
CGImage
,看起来并没有达成真正的共识。但是,如果我不调用
CGImageRelease(cgimage)
,那么内存使用量将以每秒100 MB的速度增加,因此我确信手动释放映像是正确的做法

由于启用了ARC,所以在释放所有内容后,我尝试将
uiimage
设置为
nil
,但没有成功。不存储调用
imageWithCGImage:
的返回值也不能防止泄漏

关于如何使用核心图形,我是否缺少一些基本的东西

关于如何使用核心图形,我是否缺少一些基本的东西

似乎更可能的是,您缺少了一些关于内存管理的基本知识

<许多基础/可可框架命令,特别是那些创建现成对象的命令,使自动恢复的对象成为可能。这意味着您不必释放该对象,因为它将在稍后使用完毕后自动释放。但这怎么可能呢?这些对象进入自动释放池,一旦它们的保留计数降至零,它们将在以后有机会时被排空。但是你一直在循环,所以没有这样的机会。因此,您需要在一个
@autoreleasepool{}
块中包装您的麻烦行,以便构建和耗尽您自己的池

还请注意,可能存在您不知道的中间自动释放对象。自动释放池也可以帮助解决这些问题

有关自动释放对象的详细信息,请参见