gpt4 book ai didi

iphone - CGImage 中的内存泄漏

转载 作者:行者123 更新时间:2023-11-29 13:51:23 43 4
gpt4 key购买 nike

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

这是泄露的代码:

[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(作为 unsigned char 数组)创建一个 UIImage

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

CGImageRef new_img = CGBitmapContextCreateImage(context);

在这里:

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

虽然我释放了它们 :( 有人可以告诉我如何解决这个问题吗?

提前致谢^-^

最佳答案

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

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

此外:不要调用您的属性 newImg。前缀 new 在 ObjC 中有特殊含义(它意味着返回的对象应该有一个有效的 +1 保留计数)。这可能会导致内存问题和误报警告。它的名称应该类似于 convertedImagenextImage

关于iphone - CGImage 中的内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2341724/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com