返回一个UIImage,其后面的数据被释放导致bad_access

时间:2013-10-15 08:15:48

标签: ios objective-c uiimage

我正在使用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成为它自己的对象,它可以自己控制它的底层数据。

0 个答案:

没有答案