0

iOS アプリのクラッシュ (EXC_BAD_ACCESS) を修正するための助けを感謝します。利用可能な最新の iOS 8.1.2 を使用してアプリを iOS 8 に更新してから、この問題が発生しています。同じコードが iOS 7.x でも正常に機能しました。

私のアプリのビューの 1 つは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

まず、遅い回答で申し訳ありませんが、同じ問題を抱えている人に役立つかもしれません。主な理由は、imageIO が私の例で必要なだけ速くイメージを読み込めないことですUITableViewCell。多分それは彼の論理で誰かを助けるでしょう. Image を NSData にロードしてから、UIImage に変換してみてください。

たとえば、cellForRowAtIndexPath

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

したがって、returnImageCGContext を使用する imageIO func または func にロードする場合は、値を指定してみてくださいreturnImage

于 2015-10-06T11:22:58.647 に答える
0

それは私にも起こりました。私の場合、写真を切り取っています。私の推測では、iCloud が一時的なネットワーク障害に苦しんでいたためだろう。おそらくバグレポートを提出するのが最善です。

于 2015-01-28T12:13:43.930 に答える
0

私が呼び出したAPIが500をスローし、PNGに変換しようとしていたtmp >> NSDataファイルで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 に答える