与CGDataProviderCopyData相关的内存泄漏

Jea*_*ane 1 memory-leaks core-graphics ios ios7

我用这个函数来知道我的图片是否包含某种颜色的像素:


     - (BOOL)imageHasOrange:(UIImage *)img
     {
           CGImageRef imageRef = img.CGImage;

    NSData *data = (__bridge NSData *)  CGDataProviderCopyData(CGImageGetDataProvider(imageRef));

           unsigned char *pixels = (unsigned char *)[data bytes];

           BOOL hasColor = NO;

           for(int i = 0; i < [data length]; i += 4)
           {
                if(pixels[i] == 255 && pixels[i+1] == 132 && pixels[i+2] == 0)
                {
                   hasColor = YES;
                   break;
                }
           }

           CFRelease(imageRef);

           return hasColor;

      }
Run Code Online (Sandbox Code Playgroud)

当我使用Instruments跟踪内存泄漏时,它表示它与CGDataProviderCopyData函数有关.

但我使用ARC所以我不需要发布我的"数据"数组吧?

Pet*_*sey 5

CGDataProviderCopyData返回一个所有权,就像它的名字所说:复制功能是如此记录的.

所以,你拥有那个数据对象.

ARC默认情况下不管理CF对象,并且__bridge强制转换不会更改ARC对象的内存管理:它不会导致ARC保留对象或释放它.

因此,因为您使用过__bridge,您仍然有义务发布数据.

选项1是通过调用来维护您的义务并自行发布数据CFRelease((__bridge CFDataRef)data).

选项2是告诉ARC"在这里,当我完成它时处理它".为此,您需要使用__bridge_transfer强制转换将对象的管理转移到ARC.

只选择其中一个选项.如果您将对象的管理转移到ARC,请不要自行释放 - 转移意味着您不再需要这样做; 你已将责任转移到ARC.


虽然我们正在讨论发布的事情:你不需要,也不应该发布imageRef.UIImage拥有这一点而你却没有.如果你从拥有它的UIImage下面释放它,你将导致崩溃.