我有内存泄漏,我只是不知道如何解决。
这是泄露的代码:
[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];
虽然我发布了他们两个:(有人可以告诉我如何解决这个问题吗?
提前致谢^ - ^
答案 0 :(得分:1)
几乎可以肯定,您未能在代码中的其他位置发布newImg
。也许你没有在-dealloc
发布它。如果这是真的,那么Instruments将标记分配内存的代码行。它不知道你应该或不应该释放的时间;它只知道何时分配内存以及何时释放内存。您需要审核代码,了解如何管理此ivar。
那就是说,你直接访问你的ivars,这很糟糕。这是ObjC中内存问题的首要原因。使用属性和访问器(init
和dealloc
除外),这些问题将会消失。 (并转换为ARC。很少有理由再使用手动保留计数,特别是在iOS上。尽管如此,即使使用ARC,我建议使用存取器而不是直接触摸你的ivars。)
另外:请勿致电您的财产newImg
。前缀new
在ObjC中具有特殊含义(这意味着返回的对象应具有有效的+1保留计数)。这可能会导致内存问题和误报警告。它的名称应为convertedImage
或nextImage
。
答案 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。
我希望它会有所帮助:)