gpt4 book ai didi

caching - imageWithCGImage 没有被释放或者被类似于 imageNamed 的缓存捕获,有什么方法可以生成动态图像吗?

转载 作者:行者123 更新时间:2023-12-02 08:14:59 25 4
gpt4 key购买 nike

我正在使用位桶生成 UIImages,动态创建它们并交换 UIImageView 的图像。有没有办法直接编辑UIImageView的图像? (即,更改特定像素的颜色,而不从 UIImageView 中删除 UIImage,然后重新绘制它。)

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

注意:topologyImage 数组是 RGBA 像素桶。 REF 变量未释放。每次尝试这样做都会使下一个调用崩溃。如果没有,Instruments 报告没有泄漏。

========

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);

似乎对我来说工作得很好,所以导致崩溃的原因似乎是由于示例之外的原因,例如您如何将图像数据导入到topologyImage中

关于caching - imageWithCGImage 没有被释放或者被类似于 imageNamed 的缓存捕获,有什么方法可以生成动态图像吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6719104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com