5

我有一个方法来调整 aCGImageRef和 return CGImageRef。问题是最后几行,我需要以某种方式释放但之后将其返回。有任何想法吗?谢谢

 -(CGImageRef)resizeImage:(CGImageRef *)anImage width:(CGFloat)width height:(CGFloat)height
{

    CGImageRef imageRef = *anImage;

    CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(imageRef);

    if (alphaInfo == kCGImageAlphaNone)
        alphaInfo = kCGImageAlphaNoneSkipLast;


    CGContextRef bitmap = CGBitmapContextCreate(NULL, width, height, CGImageGetBitsPerComponent(imageRef), 4 * width, CGImageGetColorSpace(imageRef), alphaInfo);

    CGContextDrawImage(bitmap, CGRectMake(0, 0, width, height), imageRef);

    CGImageRef ref = CGBitmapContextCreateImage(bitmap);

    CGContextRelease(bitmap);
    CGImageRelease(ref); //issue here

    return ref;

}
4

2 回答 2

7

Cocoa 内存管理命名策略规定,您拥有一个由名称以alloccopynew开头的方法创建的对象。
Clang 静态分析器也遵守此规则。

请注意,Core Foundation 的约定略有不同。详细信息可以在Apple 的高级内存管理编程指南中找到。

我修改了您的上述方法以符合该命名约定。传入时我还删除了星号anImage,因为CGImageRef它已经是一个指针。(或者这是故意的?)。
请注意,您拥有退回的物品,以后CGImage必须使用CGImageRelease它。

-(CGImageRef)newResizedImageWithImage:(CGImageRef)anImage width:(CGFloat)width height:(CGFloat)height
{
    CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(anImage);
    if (alphaInfo == kCGImageAlphaNone)
    {
        alphaInfo = kCGImageAlphaNoneSkipLast;
    }
    CGContextRef bitmap = CGBitmapContextCreate(NULL, width, height, CGImageGetBitsPerComponent(anImage), 4 * width, CGImageGetColorSpace(anImage), alphaInfo);
    CGContextDrawImage(bitmap, CGRectMake(0, 0, width, height), anImage);
    CGImageRef image = CGBitmapContextCreateImage(bitmap);
    CGContextRelease(bitmap);
    return image;
}
于 2013-06-10T08:35:03.780 回答
0

您还可以对指针进行操作anImage(在删除星号后,如@weichsel 建议的那样)并返回void

不过,您应该阅读您的代码并思考以下问题:

  • 谁拥有anImage?(显然不是你的方法,因为它既不保留也不复制它)
  • 如果它在你的方法中被所有者释放会发生什么?(或您的代码运行时可能发生的其他事情)
  • 你的方法完成后会发生什么?(又名:你记得在调用代码中释放它吗)

因此,我强烈建议您不要将使用函数、指针和“经典”数据结构的 CoreFoundation 与使用对象和消息的 Foundation 混合使用。如果你想对 CF 结构进行操作,你应该编写一个 C 函数来完成它。如果你想对 Foundation 对象进行操作,你应该编写带有方法的(子)类。如果你想混合两者或提供一个桥梁,你应该确切地知道你在做什么,并编写暴露基础 API 并在内部处理所有 CF 内容的包装类(因此何时发布结构留给你)。

于 2013-06-10T08:50:42.647 回答