2
我正在从Path方法写一个创建CGImageRef。这是:垃圾收集器和核心图形
- (CGImageRef)createImage:(NSString*)path
{
// Create NSURL
NSURL *url = [NSURL fileURLWithPath:path];
CFURLRef cfURL = (CFURLRef)url;
// Create image from source
CGImageRef image = NULL;
CGImageSourceRef imageSource = NULL;
imageSource = CGImageSourceCreateWithURL(cfURL, NULL);
if(imageSource != NULL) {
image = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL); // LEAK
CFRelease(imageSource);
} else {
NSLog(@"Could not load image");
return NULL;
}
// Scale Image
if(image != NULL) {
// Create context
CGRect rect = CGRectMake(0.0f, 0.0f, CGImageGetWidth(image), CGImageGetHeight(image));
CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceGenericRGB);
CGContextRef context = CGBitmapContextCreate(NULL, rect.size.width,
rect.size.height, 8, 0,
colorSpace,
kCGImageAlphaPremultipliedFirst);
CGContextSetInterpolationQuality(context, kCGInterpolationHigh);
CGContextDrawImage(context, rect, image); // LEAK
CGContextFlush(context);
CGColorSpaceRelease(colorSpace);
CGImageRelease (image);
// Create scaledImage
scaledImage = CGBitmapContextCreateImage(context); // LEAK
image = scaledImage;
CGContextRelease (context);
}
return image;
}
我已打开垃圾收集器。当我使用Instrument时,发现CGImageSourceCreateImageAtIndex,CGContextDrawImage和CGBitmapContextCreateImage中有泄漏。请问哪里错误?如何在Core Graphics中管理内存当我打开垃圾收集器时?谢谢你,原谅我的英语。
感谢戴夫。我释放返回的CGImageRef。泄漏出现在createImage方法中。 – Fernando 2010-10-08 16:52:09
@Fernando the Leaks工具显示泄漏内存的创建位置,而不是丢失的位置。换句话说,它显示你*泄露了什么,而不是泄漏哪里。 – 2010-10-08 17:23:28
如果点击右键(View Buttons),我可以查看堆栈跟踪。 http://cl.ly/ebef2544db1817189bc1在这个堆栈跟踪中,我在createImage方法中看到了一些错误:http://cl.ly/60c121f7e38ea92431bb – Fernando 2010-10-08 18:29:03