将设备更改为 ipad 视网膜时如何解决 Exe Bad access

Posted

技术标签:

【中文标题】将设备更改为 ipad 视网膜时如何解决 Exe Bad access【英文标题】:How to solve Exe Bad access when changing device to ipad retina 【发布时间】:2013-03-14 10:09:29 【问题描述】:

我们正在开发 ipad 应用程序,我正在通过此代码比较两个图像:

-(BOOL) compareTwoImages:(UIImage *) firstImage SecondImage:(UIImage *) secondImage


    int count=0;
    int match=0;
    int mismatch=0;

    //  UIColor* color = nil;
    CGImageRef inImage = [firstImage CGImage];
    CGImageRef outImage =[secondImage CGImage];

    // Create off screen bitmap context to draw the image into. Format ARGB is 4 bytes for each pixel: Alpa, Red, Green, Blue
    CGContextRef cgctx = [self createARGBBitmapContextFromImage:inImage];//this method creates context

    CGContextRef cgctx1 = [self createARGBBitmapContextFromImage:outImage];
    if (cgctx == NULL)  return NO; /* error */ 
    else if (cgctx1 == NULL)  return NO; /* error */ 

    size_t w = CGImageGetWidth(inImage);
    size_t h = CGImageGetHeight(inImage);
    CGRect rect = 0,0,w,h;

    // Draw the image to the bitmap context. Once we draw, the memory
    // allocated for the context for rendering will then contain the
    // raw image data in the specified color space.

    CGContextFlush(cgctx);
    CGContextFlush(cgctx1);


    CGContextDrawImage(cgctx, rect, inImage);
    CGContextDrawImage(cgctx1, rect, outImage);


    CGContextFlush(cgctx);
    CGContextFlush(cgctx1);

    CGContextFlush(cgctx);
    CGContextFlush(cgctx1);



    // Now we can get a pointer to the image data associated with the bitmap
    // context.
    unsigned char* data = CGBitmapContextGetData (cgctx);
    unsigned char* data1 = CGBitmapContextGetData (cgctx1);


    if ((data != NULL)&&(data1 != NULL))
    
        //offset locates the pixel in the data from x,y.
        //4 for 4 bytes of data per pixel, w is width of one row of data.

        for( int yy=0;yy<h;yy++)
        
            for (int xx=0; xx<w; xx++)
            
                int offset = 4*((w*round(yy))+round(xx));
                int alpha =  data[offset];
                int alpha1 =  data1[offset];**//it is giving bad access here and finally crashing** 


                if( alpha >1 )
                
                    count++;

                    if( alpha1 > 1 )
                    
                        match++;

                    

                


                if( (alpha1 >1 )&& (alpha < 1))
                

                    mismatch++;

                


                //      NSLog(@"offset: %i colors: RGB A %i %i %i  %i",offset,red,green,blue,alpha);

            
        

    

    // When finished, release the context
    CGContextRelease(cgctx);
    CGContextRelease(cgctx1);
    // Free image data memory for the context
    if (data)  free(data); 
    if (data1)  free(data1); 


    int matchPer =(int) (( (float) match/count)*100);
    int misMatchPer =(int) (( (float) mismatch/count)*100);


    NSLog(@"number of match px :%d  mismatch px :%d total count :%d  precntage %d mismathc per %d",match,mismatch,count,matchPer,misMatchPer);

    if(( matchPer>70)&&(misMatchPer <2000)) //do anything

当我通过此代码比较图像时,它在 ipad 中运行良好,但是当我选择模拟器硬件时出现问题 >>ipad 视网膜....

我试图通过仪器>>僵尸捕捉这种不良访问,但无法捕捉它崩溃的原因......

【问题讨论】:

你能告诉我们它在哪里崩溃,或者你的崩溃日志是什么 【参考方案1】:

只是一个想法:当应用程序已经在模拟器中运行时,您是否将模拟器更改为 iPad Retina?如果是这种情况,您不必担心崩溃。发生这种情况是因为您突然尝试停止应用程序的执行(当您更改模拟器版本时,任何正在运行的应用程序都会退出),而不是从 Xcode 正确停止它。

【讨论】:

如果您注意到我将 2 个图像对象传递给此比较方法(第一个对象是虚线图像对象,第二个对象是:我正在绘制的图像)。我的错误是,当我转换时模拟器到 ipad 视网膜..现在它将考虑 2x(视网膜)图像,它与普通图像具有双倍分辨率。这意味着它将采用 2x 图像 od 虚线(在比较图像方法的第一个对象中)和第二个对象我是没有通过 2x 这就是我崩溃的原因.. 很高兴你发现了这个错误。干杯!

以上是关于将设备更改为 ipad 视网膜时如何解决 Exe Bad access的主要内容,如果未能解决你的问题,请参考以下文章

JSONKit 崩溃:iPad 视网膜 64 位设备模拟器中的 iOS 7 Xcode 5.1

Xcode 资产目录 - 有没有办法只为 iPad 非视网膜标记精灵?

如何在资产目录新图像集中删除所有 iPhone/iPad 视网膜/非视网膜图像

在 iPad 设备上测试时如何访问内存泄漏工具?

视图不适合 ios 中的 ipad 视网膜

为视网膜/非视网膜设备创建 1 个 UIImage 并手动调整大小