将设备更改为 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 非视网膜标记精灵?