我正在使用ARC。我有这样的事情:
-(UIImage *)buildFullResImage
{
// blah blah does stuff to make a CGImage ref from some data...
CGImageRef imageRef = CGImageCreate(imageWidth, imageHeight, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);
// then make the uiimage from that
UIImage *myImage = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:UIImageOrientationUp];
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpaceRef);
free(buffer);
return myImage;
}
然后在其他地方我这样做......
UIImage *thisImage = [self buildFullResImage];
UIImage *resizedImage = [self imageWithImage:thisImage scaledToSize:CGSizeMake(newWidth, newHeight)];
在imageWithImage方法中,我遇到了bad_access崩溃,因为实际的图像数据(在缓冲区中)在buildFullResImage中被释放。我已经尝试了几种不同的imageWithImage方法,可以在SO上轻松找到。它总是在访问传递的uiimage数据时崩溃。通常情况下它会像以下一样崩溃:
CGContextDrawImage(bitmap, newRect, imageRef);
或
CGContextDrawImage(thisContext, CGRectMake(0.0, 0.0, imageSize.width, imageSize.height), image);
UIImage遇到宽度和高度以及地址(不为空)但显然没有数据......因为我在返回图像之前发布了数据。退回后你无法释放它。
我不想释放缓冲区和imageRef并且有泄漏。我不想复制代码或合并调整大小与建筑物,因为我不总是需要使用调整大小的版本。我想要模块化代码。
我知道这似乎是客观的-c 101但我已经和它斗争了好几个小时。我有一个愚蠢的快速工作,但我想知道正确的方法来做到这一点。
UPDATE ..
我的愚蠢工作是我创建缓冲区,myImage和imageRef所有全局属性,所以它们保持不变直到我准备发布它们。在我完成使用它们来保存图像或我正在做的任何事情后,我可以设法释放它们。但似乎有一种方法可以使我正在返回的UIImage成为它自己的对象,它可以自己控制它的底层数据。