我正在使用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 并且有泄漏。我不想复制代码或将调整大小与建筑物合并,因为我并不总是需要使用调整大小的版本。我想要模块化代码。
我知道这看起来像是objective-c 101,但我已经和它斗争了好几个小时。我有一个愚蠢的快速工作,但我想知道正确的方法来做到这一点。
更新..
我的愚蠢工作是我将缓冲区、myImage 和 imageRef 设为所有全局属性,因此它们会一直保留,直到我准备好释放它们为止。在我用完它们来保存图像或我正在用它做的任何事情后,我可以设法释放它们。但似乎有一种方法可以使我返回的 UIImage 成为它自己的对象,它自己控制它的基础数据。