我正在用一个桶创建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];
}
答案 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