感谢任何帮助修复我的 iOS 应用程序中的崩溃 (EXC_BAD_ACCESS)。自从使用最新的可用 iOS 8.1.2 将我的应用程序更新到 iOS 8 后,我看到了这一点。相同的代码在 iOS 7.x 中运行良好。
我的应用程序中的一个视图是UICollectionView
. 集合视图的每个单元格都显示一个图像,该图像是动态呈现的,并且每隔几分钟就会随着新内容的出现而变化。
单元格的左上角还显示集合视图的该单元格的文本标签/标题。为了确保文本标签可以根据单元格图像的颜色读取,我有一些代码(见下文)来确定单元格左上角的图像颜色。基于该颜色,我使用白色或黑色作为单元格的文本标签/标题(显示在单元格中的图像顶部)。
下面是代码片段。我经常在以下代码行中遇到崩溃 EXC_BAD_ACCESS 崩溃:
CGContextDrawImage(context, CGRectMake(0, 0, 1, 1), imageRef);
Xcode 中显示的错误日志...
: ImageIO: CGImageReadGetBytesAtOffset : * 错误 * CGImageSource 是使用数据大小创建的:684918 - 当前大小仅为:526399
: ImageIO: CGImageReadGetBytesAtOffset : * 错误 * CGImageSource 是使用数据大小创建的:203207 - 当前大小仅为:199641
代码如下,感谢您解决此问题的任何帮助,谢谢。
-(UIColor *) averageColorOfImageTitleArea {
//CGRect croppedImageRect = CGRectMake (6,0,100,29);
CGRect croppedImageRect = CGRectMake (0,0,1,1);
CGImageRef imageRef = CGImageCreateWithImageInRect (self._collectionViewImage.image.CGImage,croppedImageRect);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char rgba[4];
CGContextRef context = CGBitmapContextCreate(rgba, 1, 1, 8, 4, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGContextDrawImage(context, CGRectMake(0, 0, 1, 1), imageRef);
if(rgba[3] > 0) {
CGFloat alpha = ((CGFloat)rgba[3])/255.0;
CGFloat multiplier = alpha/255.0;
return [UIColor colorWithRed:((CGFloat)rgba[0])*multiplier
green:((CGFloat)rgba[1])*multiplier
blue:((CGFloat)rgba[2])*multiplier
alpha:alpha];
}
else {
return [UIColor colorWithRed:((CGFloat)rgba[0])/255.0
green:((CGFloat)rgba[1])/255.0
blue:((CGFloat)rgba[2])/255.0
alpha:((CGFloat)rgba[3])/255.0];
}
CGContextRelease(context);
CGImageRelease(imageRef);
CGColorSpaceRelease(colorSpace);
}