【问题标题】:CGImage creates a lot of dirty memory causing the app to crashCGImage 创建大量脏内存导致应用程序崩溃
【发布时间】:2012-07-22 01:22:05
【问题描述】:

我尝试通过填写自己的数据来创建 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)];
    }
}

【问题讨论】:

  • 为什么选择 VM Tracker?分配工具告诉您有关实时内存的哪些信息?
  • 我收到内存不足报告,根据link 上的“了解和分析 iOS 应用程序崩溃报告”,我需要使用 VM Tracker 来跟踪图形内存。现场记忆似乎还可以。
  • 你会怎么称呼好吗?我会很惊讶……
  • 嗯..我刚刚发现我只启用了跟踪活动分配。如果不启用此功能,内存似乎不正常。所有分配的总字节数超过 300MB。

标签: iphone ios5 memory-management cgimage


【解决方案1】:

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

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

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

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

【讨论】:

  • 谢谢,这就是问题所在!我现在使用计时器来调用该函数,它运行良好。
  • 另一种选择是将工作块包装在@autoreleasepool{ .. }
猜你喜欢
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 2015-08-15
  • 1970-01-01
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多