CGImage会产生大量脏内存,导致应用程序崩溃

Dav*_*rri 4 iphone memory-management cgimage ios5

我尝试通过填写自己的数据来创建UIImage.到目前为止一切正常.但是,如果我尝试多次调用此函数,它似乎会填满内存,直到应用程序崩溃.使用VM Tracker我发现脏内存增长到328MB,当应用程序崩溃时,290MB是CG图像内存.

我多次调用我的函数循环,从而启用ARC.图像非常大,但这应该不是问题,因为它适用于29次迭代.据我所知,脏内存应该再次被应用程序重用.是对的吗?那么为什么它会填满我的记忆呢?我该如何避免这个问题呢?

for(int i = 0; i < 1000; ++i) {
    UIImage *img = [self createDummyImage:CGSizeMake(2000, 1600)];
}
Run Code Online (Sandbox Code Playgroud)

创建虚拟UIImage的功能:

- (UIImage*)createDummyImage:(CGSize)size
{
    unsigned char *rawData = (unsigned char*)malloc(size.width*size.height*4);

    // fill in rawData (logic to create checkerboard)

    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo = kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Host;
    CGContextRef contextRef = CGBitmapContextCreate(rawData, size.width, size.height, 8, 4*size.width, colorSpaceRef, bitmapInfo);
    CGImageRef imageRef = CGBitmapContextCreateImage(contextRef);

    CGColorSpaceRelease(colorSpaceRef);
    CGContextRelease(contextRef);
    free(rawData);

    UIImage *image = [UIImage imageWithCGImage:imageRef];
    CGImageRelease(imageRef);

    return image;
}
Run Code Online (Sandbox Code Playgroud)

hooleyhoop的工作解决方案

将函数调用放入自动释放池中.

for (int i = 0; i < 1000; ++i) {
    @autoreleasepool {
        UIImage *img = [self createDummyImage:CGSizeMake(2000, 1600)];
    }
}
Run Code Online (Sandbox Code Playgroud)

hoo*_*oop 5

我想如果你在Allocations工具中查看'live'内存,你会发现你的内存正常用完 - 与脏VM无关.

这很可能是因为你有太多的内存等待自动释放.在弹出当前自动释放池之前,不会释放自动释放的对象 - 您试图将数百兆字节的对象添加到一个自动释放池中.

答案是管理自己的自动释放池,或者在一个事件循环中不做太多工作.

对不起,但我无法抗拒讽刺评论..在我看来,这在ARC之前会更加明显.