感谢修复我的 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);
}