imageWithCGImage没有被释放或被类似于imageNamed的Cache捕获,是否可以解决生成动态图像的问题?

时间:2011-07-16 17:42:22

标签: caching crash uiimageview uiimage

我正在用一个桶创建UIImages,在运行中创建它们并交换UIImageView的图像。有没有办法直接编辑UIImageView的图像? (即更改特定像素的颜色,而不从UIImageView中删除UIImage,并将其重绘。)

目前,我正在刷新UIImage并使用imageWithCGIImage创建一个新的,并将其分配给UIImageView。这有效。没有MemLeaks。但在iPhone(3Gs)上大约100个图像更换后,CRASHES。 Cache'n问题?如果缓存未释放,则内存总和似乎达到了手机的限制,但是,模拟器不显示每次图像交换的内存消耗。保持平坦而不泄漏。

注意:topologyImage数组是RGBA像素桶。 REF变量未发布。每次尝试这样做,都会在接下来的电话中崩溃。没有,仪器报告没有泄漏。

======

CGColorSpaceRef colorSpaceRef=CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaLast;
CGColorRenderingIntent renderingIntent=kCGRenderingIntentDefault;
CGDataProviderRef provider=CGDataProviderCreateWithData(NULL,topologyImage,(I*I*4),NULL);
CGImageRef imageRef=CGImageCreate(I,I,8,4*8,4*I,colorSpaceRef,bitmapInfo,provider,NULL,false,renderingIntent);

UIImage *img=[UIImage imageWithCGImage:imageRef];
if( IMG[NDXtopo].vw ) {
    [IMG[NDXtopo].vw setImage:img];
    }
else {
    IMG[NDXtopo].vw=[[UIImageView alloc] initWithImage:img];
    [master.view addSubview:IMG[NDXtopo].vw];
    }

1 个答案:

答案 0 :(得分:1)

基本上你应该释放你的引用,特别是CGImageRef,因为imageWithCGImage没有获得CGImage的所有权,而是似乎在内部复制数据。

关于这方面的文档还不太清楚,但是根据我在测试中发现的,如果我不发布CGImageRefs和CGDataProviderRefs,它最终会导致应用程序获得内存警告......然后崩溃。

不确定为什么会发生崩溃,但在使用以下方法进行快速测试时

UIImageView *view = [[UIImageView alloc] init];
int I = 128;
unsigned char *topologyImage = malloc(I*I*4*sizeof(unsigned char));

for(int i=0; i<I*I*4; i++)
{
  topologyImage[i] = 100;
}

for(int i=0; i<1000; i++)
{
    CGColorSpaceRef colorSpaceRef=CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault | kCGImageAlphaLast;
    CGColorRenderingIntent renderingIntent=kCGRenderingIntentDefault;
    CGDataProviderRef provider=CGDataProviderCreateWithData(NULL,topologyImage,(I*I*4),NULL);
    CGImageRef imageRef=CGImageCreate(I,I,8,4*8,4*I,colorSpaceRef,bitmapInfo,provider,NULL,false,renderingIntent);
    CGColorSpaceRelease(colorSpaceRef);
    CGDataProviderRelease(provider);

    UIImage *img=[UIImage imageWithCGImage:imageRef];
    view.image = img;
    CGImageRelease(imageRef);
}
free(topologyimage);

似乎对我来说工作得很好,所以导致崩溃的原因似乎是因为你的例子之外的东西,例如你如何将图像数据放入topologyImage