1

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

这是泄漏代码:

[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

4 回答 4

1

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

也就是说,您正在直接访问您的 ivars,这很糟糕。这是 ObjC 中内存问题的第一大原因。使用属性和访问器(除了 ininitdealloc),这些问题就会消失。(并转换为 ARC。很少有理由再使用手动保留计数,尤其是在 iOS 上。不过,即使使用 ARC,我还是建议使用访问器而不是直接接触您的 ivars。)

另外:不要打电话给你的财产newImg。前缀new在 ObjC 中具有特殊的含义(它意味着返回的对象应该有一个有效的 +1 保留计数)。这可能会导致您出现记忆问题和误报警告。它应该有一个类似convertedImageor的名字nextImage

于 2013-06-05T01:56:03.200 回答
0

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

编辑:是相关文档。

于 2012-09-03T08:36:50.383 回答
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

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

[newImg release];

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

由于您还使用 CoreFoundation 对象/函数,请考虑Core Foundation 的内存管理编程指南

我希望它会有所帮助:)

于 2013-05-05T15:05:27.380 回答
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);

已经对此进行了测试,并且它不会在我这边泄漏​​。

于 2010-02-26T13:47:35.333 回答