CGImage中的内存泄漏

时间:2010-02-26 13:02:52

标签: iphone ios xcode memory-leaks cgimage

我有内存泄漏,我只是不知道如何解决。

这是泄露的代码:

[newImg release];
CGColorSpaceRef d_colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context =  CGBitmapContextCreate(Data, width, 
                                              height, 
                                              8, 4*width, 
                                              d_colorSpace, 
                                              kCGImageAlphaNoneSkipFirst);
UIGraphicsPushContext(context);
CGImageRef new_img = CGBitmapContextCreateImage(context);
UIImage * convertedImage = [[UIImage alloc] initWithCGImage:
                             new_img];
CGImageRelease(new_img);
CGContextRelease(context);
CGColorSpaceRelease(d_colorSpace);
newImg = convertedImage;

我修改存储在Data中的像素信息,然后用这个方法我从Data创建一个UIImage(这是一个unsigned char数组)

xcode工具告诉我这里有泄漏:

CGImageRef new_img = CGBitmapContextCreateImage(context);

在这里:

UIImage * convertedImage = [[UIImage alloc] initWithCGImage:
                             new_img];

虽然我发布了他们两个:(有人可以告诉我如何解决这个问题吗?

提前致谢^ - ^

4 个答案:

答案 0 :(得分:1)

几乎可以肯定,您未能在代码中的其他位置发布newImg。也许你没有在-dealloc发布它。如果这是真的,那么Instruments将标记分配内存的代码行。它不知道你应该或不应该释放的时间;它只知道何时分配内存以及何时释放内存。您需要审核代码,了解如何管理此ivar。

那就是说,你直接访问你的ivars,这很糟糕。这是ObjC中内存问题的首要原因。使用属性和访问器(initdealloc除外),这些问题将会消失。 (并转换为ARC。很少有理由再使用手动保留计数,特别是在iOS上。尽管如此,即使使用ARC,我建议使用存取器而不是直接触摸你的ivars。)

另外:请勿致电您的财产newImg。前缀new在ObjC中具有特殊含义(这意味着返回的对象应具有有效的+1保留计数)。这可能会导致内存问题和误报警告。它的名称应为convertedImagenextImage

答案 1 :(得分:0)

编辑:原始帖子似乎没有帮助,所以删除并重新发布。

请改为尝试:

//[newImg release]; DELETE THIS LINE
CGColorSpaceRef d_colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context =  CGBitmapContextCreate(Data, width, 
                                              height, 
                                              8, 4*width, 
                                              d_colorSpace, 
                                              kCGImageAlphaNoneSkipFirst);
UIGraphicsPushContext(context);
CGImageRef new_img = CGBitmapContextCreateImage(context);

newImg = [UIImage imageWithCGIImage:new_img];

CGImageRelease(new_img);
CGContextRelease(context);
CGColorSpaceRelease(d_colorSpace);

已对此进行了测试,并且它不会泄漏。

答案 2 :(得分:0)

CGBitmapContextCreate不会释放您提供的数据。要么给它NULL(在这种情况下上下文将管理它自己的后备内存),或者在释放上下文后自己释放它。

编辑:here是相关文档。

答案 3 :(得分:0)

我觉得你没有发布convertedImage尝试替换这一行

UIImage * convertedImage = [[UIImage alloc] initWithCGImage:
                             new_img];

这一个

UIImage * convertedImage = [[[UIImage alloc] initWithCGImage:
                             new_img] autorelease];

代码。

如果我理解正确(基于提问的评论),你就像这样声明newImg属性:

@property (nonatomic, retain) UIImage* newImg; //or something like that

在这种情况下,此属性的合成setter将保留将分配给它的任何对象。并在值发生变化时释放它。 所以你不负责发布它,你应该删除这一行:

[newImg release];

我想,你能做的最好的事情就是阅读Advanced Memory Management Programming Guide。它不会太长,但它提供了iOS内存管理中使用的主要约定的完整概述。

由于您还使用CoreFoundation对象/函数,请考虑Memory Management Programming Guide for Core Foundation

我希望它会有所帮助:)