Caching imageWithCGImage未被释放或被类似ImageName的缓存捕获,是否有生成动态图像的解决方法?

Caching imageWithCGImage未被释放或被类似ImageName的缓存捕获,是否有生成动态图像的解决方法?,caching,crash,uiimageview,uiimage,Caching,Crash,Uiimageview,Uiimage,我用一个小bucket生成UIImages,动态创建它们并交换UIImageView的图像。有没有办法直接编辑UIImageView的图像?(即,在不从UIImageView中删除UIImage的情况下,更改特定像素的颜色,并使其重新绘制。) 目前,我正在刷新UIImage并使用imageWithCGIImage创建一个新的,并将其分配给UIImageView。这很有效。显示没有内存泄漏。但在iPhone(3Gs)上,在更换了大约100张图像后,崩溃了。缓存问题?如果缓存不释放,内存总和似乎达到

我用一个小bucket生成UIImages,动态创建它们并交换UIImageView的图像。有没有办法直接编辑UIImageView的图像?(即,在不从UIImageView中删除UIImage的情况下,更改特定像素的颜色,并使其重新绘制。)

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

注: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];
    }

基本上,您应该释放引用,尤其是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);
UIImageView*视图=[[UIImageView alloc]init];
int I=128;
无符号字符*topologyImage=malloc(I*I*4*sizeof(无符号字符));

对于(int i=0;i基本上,您应该释放引用,尤其是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);
UIImageView*视图=[[UIImageView alloc]init];
int I=128;
无符号字符*topologyImage=malloc(I*I*4*sizeof(无符号字符));

对于(int i=0;我感谢您的快速回复。::感谢您的快速回复。我对您的代码做了一些更改;免费(topologyImage)I=320,一切正常。将UIImageView添加到UIView并崩溃。分配后将imageview添加到视图中。然后循环创建图像和查看。图像分配。在模拟器中工作正常。在iPhone上崩溃。上一篇文章。仅使用发行版()对我的代码运行了另一个测试添加了。创建了拓扑,并使用touch删除了大块的地球。84 touch删除了整个图像,touch 85重新生成了一个新的拓扑图。在发布()之前,它在第二个地图中崩溃。在发布()之前,它运行了十个地图,没有崩溃。在这里发布之前,我使用RELEASE()进行了测试,并得到了相同的结果。我可能做了错误的事情吗?colorSpaceRef在提供商之前,在创建图像之前发布是否很重要?谢谢。据我所知,顺序应该无关紧要,这主要是一种习惯,在完成了在原始iPhone上发布的内容之后,尽早发布内存非常有限。因此我不确定您所做的操作是否会产生不同的结果。感谢您的快速回复。::感谢您的快速回复。我已对您的代码进行了一些更改;免费(拓扑图像)I=320,一切正常。将UIImageView添加到UIView并崩溃。分配后将imageview添加到视图中。然后循环创建图像和查看。图像分配。在模拟器中工作正常。在iPhone上崩溃。上一篇文章。仅使用发行版()对我的代码运行了另一个测试添加了。创建了拓扑,并使用touch删除了大块的地球。84 touch删除了整个图像,touch 85重新生成了一个新的拓扑图。在发布()之前,它在第二个地图中崩溃。在发布()之前,它运行了十个地图,没有崩溃。在这里发布之前,我使用RELEASE()进行了测试,并得到了相同的结果。我可能做了错误的事情吗?colorSpaceRef在提供商之前,在创建图像之前发布是否很重要?谢谢。据我所知,顺序应该无关紧要,这主要是一种习惯,在完成了在原始iPhone上发布的内容之后,尽早发布我的记忆力很差。所以我不确定你在做什么,结果会不一样。