0

感谢任何帮助修复我的 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);

}
4

3 回答 3

0

它也发生在我身上。就我而言,在剪辑图片时。我猜这是因为 iCloud 遇到了暂时的网络故障。可能最好提交错误报告。

于 2015-01-28T12:13:43.930 回答
0

首先对迟到的答案感到抱歉,但也许它会帮助有同样问题的人。主要原因是 imageIO 无法以我正在重新排序的示例所需的速度加载图像UITableViewCell。也许它会帮助他的逻辑。并尝试将 Image 加载到 NSData 中,然后转换为 UIImage。

例如在cellForRowAtIndexPath

  let image = UIImagePNGRepresentation(self.imageArray[indexPath.row])
  let returnImage = UIImage(data: image)

因此,如果您加载returnImage到使用 CGContext 的 imageIO func 或 func 中,请尝试给出该​​值returnImage

于 2015-10-06T11:22:58.647 回答
0

我收到此错误是因为我调用的 api 在我试图转换为 PNG 的 tmp >> NSData 文件中抛出 500 并返回 html 错误页面。

我假设 statusCode 为 200 并且 tmp 是 png。

您可能希望在转换之前检查您尝试打开的文件是否为图像。

您可以检查文件的字节大小是 199641 并放入断点

这是我在下载图像时如何追踪 CGImageSource 问题

func urlSession(_ session: URLSession, downloadTask: URLSessionDownloadTask, didFinishDownloadingTo location: URL){

    print("didFinishDownloadingToURL[\(location) countOfBytesReceived:\(downloadTask.countOfBytesReceived)]")

    if let httpResponse = downloadTask.response as? HTTPURLResponse{

            if httpResponse.statusCode == 200{
                //----------------------------------------------------------------------------------------
                //200 - start
                //----------------------------------------------------------------------------------------
                if (downloadTask.countOfBytesReceived == 199641){
                    //bytesize metioned in 
                    : ImageIO: CGImageReadGetBytesAtOffset : * ERROR * CGImageSource was created with data size: 203207 - current size is only: 199641

                }else{
                    //----------------------------------------------------------------------------------------
                    //Image OK
                    //----------------------------------------------------------------------------------------
                }

                //----------------------------------------------------------------------------------------
                //200 - 3nd
                //----------------------------------------------------------------------------------------
            }
            else if httpResponse.statusCode ==  500
            {
                //check the tmp file in location path
            }else{

            }
        }else{
            appDelegate.log.error("ERROR downloadTask.response NOT HTTPURLResponse for taskDescription:'\(cacheKeyString)' - 500")
        }


}
于 2016-12-06T16:02:58.407 回答