iphone - 程序收到信号 EXC_BAD_ACCESS 访问数组

标签 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 中,所以如果您想要详细信息代码的作用是什么,只需阅读那里的源代码即可。

编辑:另一件事是,这种情况在模拟器中永远不会发生,但在设备上测试时经常发生。

编辑:理想情况下,如果手指当前不在图像上,我什么都不想做,但很难弄清楚何时会发生这种情况。看起来SDK中的相关方法只显示触摸最初的 View ,而不是现在的位置。我怎样才能弄清楚?

最佳答案

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

这很好。更容易调试。

您确实提供了线索:

move it off the boundaries of the image in the process

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

解决这个问题,您的应用程序将不再崩溃。

<小时/>

您的图像是否完全占据了被触摸的项目的整个边界? IE。处理 touches*: 的事情吗?事件的宽度和高度与图像完全相同?

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

关于iphone - 程序收到信号 EXC_BAD_ACCESS 访问数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5052182/

相关文章:

iphone - 是否可以使用应用程序分发已填充的钥匙串(keychain)

iphone - Frenzapp 使用什么 "kernel level C function"来检测正在运行的 iOS 进程?

ios - 是否可以在屏幕锁定的情况下为 iPhone 使用用户定义的通知声音?

c++ - &&条件的执行方向

ios - 在自定义单元格问题中添加 UILabel

iphone - 辞去急救人员的正确(App Store 安全)方式?

iphone - 突出显示的阴影颜色

ios - UINavigationController 中的 UITabBarController 中的 UITableViewController

c - 在C中解析二进制文件

c - 链表中的键是什么?