程序接收信号EXC_BAD_ACCESS访问阵列

时间:2011-02-19 17:02:45

标签: iphone objective-c c

我正在使用例程来获取像素颜色(这一个:http://www.markj.net/iphone-uiimage-pixel-color/)并且在使用它时遇到频繁的应用程序崩溃。代码的相关部分:

unsigned char* data = CGBitmapContextGetData (cgctx);
if (data != NULL) {
    int offset = (some calculations here);
    int alpha = data[offset]; // <<<< crashes here
}

此代码链接在touchesBegan,touchesEnded和touchesMoved上运行。看起来崩溃只发生在touchesEnded和touchesMoved事件中,特别是当我开始触摸目标图像时,但是在此过程中将其移出图像的边界。

有没有办法检查data对象指向的数组中的数据大小是多少?那里可能出现什么问题?

修改的: 偏差的计算:

int offset = 4*((w*round(point.y)*x)+round(point.x)*x);

point是发生触摸的点,w是图像的宽度x是图像的比例(对于视网膜显示器上的高分辨率图像)。

我也没看到cgctx有任何问题。基本上,我运行上面几乎未经修改的链接的代码,我遇到问题的特定代码片段在函数(UIColor*) getPixelColorAtLocation:(CGPoint)point中,所以如果你想了解代码的详细信息,那么只需阅读源代码。< / p>

编辑:另一件事是,这种情况从未发生在模拟器中,但经常在设备上进行测试时发生。

编辑:理想情况下,如果手指当前未在图像上方,我想要 nothing ,但无法确定何时发生这种情况。看起来SDK中的相关方法只显示触摸源自哪个视图,而不是现在的位置。我怎么能弄明白呢?

1 个答案:

答案 0 :(得分:2)

你没有展示你的所有作品。您的offset计算可能会返回负数或远远超出缓冲区末尾的数字。由于CG* API通常会分配相当大的内存块(通常是内存映射),因此分配前后的地址很可能是未分配/未映射的,因此,在缓冲区外部访问会导致立即崩溃(而不是返回垃圾)。

哪个好。更容易调试。

你确实提供了线索:

  

将其移出界限   过程中的图像

我猜您修改了offset计算以获取触摸的位置。而且该位置已经超出了图像的范围,因此导致了无意义的offset和随后的崩溃。

修复此问题,您的应用将停止崩溃。


您的图片完全是否占据了被触摸项目的整个范围?即处理touches*:事件的事物是否有宽度和高度完全相同的边界?

如果没有,您需要确保正确地将坐标从处理触摸的内容转换为图像中的坐标。另请注意,图像中字节的布局很大程度上取决于图像的确切创建方式以及它使用的内部颜色模型。