1

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

4

0 回答 0