繁体   English   中英

CGImage中的内存泄漏

[英]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中内存问题的第一大原因。 使用属性和访问器( initdealloc除外),这些问题将趋于消失。 (然后转换为ARC。几乎没有理由再使用手动保留计数了,尤其是在iOS上。不过,即使使用ARC,我也建议您使用访问器,而不要直接触摸ivars。)

另外:不要将您的媒体资源newImg 前缀new在ObjC中具有特殊含义(这意味着返回的对象应具有有效的+1保留计数)。 这可能会导致您出现内存问题和错误肯定的警告。 它应该有一个像名convertedImagenextImage

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM