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所以我不需要发布我的"数据"数组吧?
CGDataProviderCopyData返回一个所有权,就像它的名字所说:复制功能是如此记录的.
所以,你拥有那个数据对象.
ARC默认情况下不管理CF对象,并且__bridge强制转换不会更改ARC对象的内存管理:它不会导致ARC保留对象或释放它.
因此,因为您使用过__bridge,您仍然有义务发布数据.
选项1是通过调用来维护您的义务并自行发布数据CFRelease((__bridge CFDataRef)data).
选项2是告诉ARC"在这里,当我完成它时处理它".为此,您需要使用__bridge_transfer强制转换将对象的管理转移到ARC.
只选择其中一个选项.如果您将对象的管理转移到ARC,请不要自行释放 - 转移意味着您不再需要这样做; 你已将责任转移到ARC.
虽然我们正在讨论发布的事情:你不需要,也不应该发布imageRef.UIImage拥有这一点而你却没有.如果你从拥有它的UIImage下面释放它,你将导致崩溃.
| 归档时间: |
|
| 查看次数: |
2208 次 |
| 最近记录: |