Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 程序接收信号EXC_BAD_访问阵列_Iphone_Objective C_C - Fatal编程技术网

Iphone 程序接收信号EXC_BAD_访问阵列

Iphone 程序接收信号EXC_BAD_访问阵列,iphone,objective-c,c,Iphone,Objective C,C,我正在使用获取像素颜色的例程(这一个:),使用它时经常会遇到应用程序崩溃。守则的有关部分: unsigned char* data = CGBitmapContextGetData (cgctx); if (data != NULL) { int offset = (some calculations here); int alpha = data[offset]; // <<<< crashes here } 其中,point是触摸发生的点,w是图像的

我正在使用获取像素颜色的例程(这一个:),使用它时经常会遇到应用程序崩溃。守则的有关部分:

unsigned char* data = CGBitmapContextGetData (cgctx);
if (data != NULL) {
    int offset = (some calculations here);
    int alpha = data[offset]; // <<<< crashes here
}
其中,
point
是触摸发生的点,
w
是图像的宽度,
x
是图像的比例(对于视网膜显示器上的高分辨率图像)

我也不认为cgctx有什么问题。基本上,我运行的是上面链接中的代码,几乎没有修改,我遇到问题的特定代码段位于函数
(UIColor*)getPixelColoraLocation:(CGPoint)point
,因此如果您想了解代码的详细功能,请阅读其中的源代码

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


编辑:理想情况下,如果手指当前未在图像上方,我不想做任何事情,但很难确定何时发生。看起来SDK中的相关方法只显示触摸的起源视图,而不是现在的位置。我怎么知道呢?

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

这很好。更容易调试

你确实提供了一个线索:

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

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

修复此问题,您的应用程序将停止在此崩溃


您的图像是否完全占据了被触摸物品的整个边界?也就是说,处理
触摸*:
事件的对象是否有宽度和高度与图像完全相同的边界


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

您能用这三种方法显示实际代码吗?编辑你的答案。例如,您的cgctx引用有效吗?此外,要获得数据的长度,您需要将组件乘以位图的高度和宽度。在调试时,我注意到
offset
中的数字在崩溃时和执行时都在相同的范围内,并且没有任何问题,也没有负值。见原始问题中的编辑。巧合;如果在分配缓冲区后内存恰好被占用,则很可能是在读取垃圾。图像将完全填充视图。至于字节布局,这不是我所熟悉的,但是图像是作为插入到视图中的.png文件生成的,并且保存在该视图的实例变量中。它是静态的,因此视图的大小在初始时间与图像的大小匹配,并且永远不会改变。当触摸移动到图像边界之外时,会发生一些奇怪的事情。这不是我可以预防的,但更糟糕的是,我甚至无法在我的程序中预测——不知道如何预防。理想情况下,如果手指当前不在图像上方,我不想做任何事情,但很难确定何时发生。关键是将触摸事件从视图坐标系转换为图像坐标系,同时在图像边界处加盖。如果您知道图像的宽度,并且看到一个X坐标超出该宽度,您就知道拖动会离开图像的内容区域。
int offset = 4*((w*round(point.y)*x)+round(point.x)*x);