[英]Memory leak in 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(作为未签名的char数组)
xcode工具告诉我这里有泄漏:
CGImageRef new_img = CGBitmapContextCreateImage(context);
和这里:
UIImage * convertedImage = [[UIImage alloc] initWithCGImage:
new_img];
虽然我都释放了它们:(有人可以告诉我如何解决这个问题吗?
在此先感谢^-^
几乎可以肯定,您无法在代码的其他地方发布newImg
。 也许您没有在-dealloc
释放它。 如果是这样,则Instruments将标记分配内存的代码行。 它不知道你什么时候应该释放,不应该释放。 它只知道何时分配内存以及何时释放内存。 您需要审核代码以了解如何管理此ivar。
就是说,您正在直接访问ivars,这很糟糕。 这是ObjC中内存问题的第一大原因。 使用属性和访问器( init
和dealloc
除外),这些问题将趋于消失。 (然后转换为ARC。几乎没有理由再使用手动保留计数了,尤其是在iOS上。不过,即使使用ARC,我也建议您使用访问器,而不要直接触摸ivars。)
另外:不要将您的媒体资源newImg
。 前缀new
在ObjC中具有特殊含义(这意味着返回的对象应具有有效的+1保留计数)。 这可能会导致您出现内存问题和错误肯定的警告。 它应该有一个像名convertedImage
或nextImage
。
CGBitmapContextCreate不会释放您提供的数据。 为它提供NULL(在这种情况下,上下文将管理自己的后备内存),或者在释放上下文后自行释放它。
编辑: 这是相关的文档。
在我看来,您不发布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
在这种情况下,此属性的综合设置器将保留将分配给它的任何对象。 并在值更改时释放它。 因此,您不负责发布它,因此应删除以下行:
[newImg release];
我想,您最好的办法是阅读《 高级内存管理编程指南》 。 时间不长,但它提供了iOS内存管理中使用的主要约定的完整概述。
并且由于您还使用CoreFoundation对象/函数,因此请考虑《 Core Foundation的内存管理编程指南》 。
我希望这会有所帮助:)
编辑:原始帖子似乎没有帮助,因此删除并重新发布。
尝试以下方法:
//[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);
经过测试,它不会泄漏到我身上。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.