iphone - CGImage 创建大量脏内存导致应用程序崩溃

标签 iphone ios5 memory-management cgimage

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

我在循环中多次调用我的函数,从而启用 ARC。图像相当大,但这应该不是问题,因为它在第 29 次迭代中运行良好。据我所知,脏内存应该被应用程序再次重用。是对的吗?那么为什么它会占据我的内存以及如何避免这个问题?

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

创建虚拟 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;
}

hooleyhoop 的工作解决方案

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

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

最佳答案

我认为,如果您查看分配工具中的“实时”内存,您会发现您只是耗尽了正常内存 - 与脏虚拟机无关。

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

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

抱歉,但我无法抗拒讽刺评论。在我看来,这在 ARC 之前会更加明显。

关于iphone - CGImage 创建大量脏内存导致应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11618768/

相关文章:

iphone - 充分利用plist

iphone - 这个对象是如何被过早释放的?

iphone - iOS 5 使用 App Delegate 加载模态框

objective-c - 使用 ARC,如何正确设置具有副作用的属性?

多处理器机器上的 Java 堆和 GC?

iphone - 混合 HTML/Objective-C iphone 应用程序的优点/缺点

ios - 如何计算视频的比特率?

ios - 阻止表格 View 在单元格中重复背景图像

iphone - 使用 iPhone 打印和保存网页

c++ - 为什么在c/c++中需要分配内存?