我正在Xcode中构建iOS应用。我的构建遇到了问题。具体来说,当我在我的物理设备(iPhone 5)和任何模拟的32位设备上运行我的应用程序时,它运行正常。但是,如果我使用4英寸64位设备,我会在特定的代码行上收到以下错误:
Thread 1: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
我猜这个错误意味着什么,因为我没有用任何其他设备来获取它。
我已经尝试清理我的构建和构建文件夹,甚至还原到之前没有出现此问题的提交。那是行不通的(令我惊讶的是)。
当我第一次遇到这个错误时,我遇到了与this StackOverflow question有关的图像("无法加载""图像中从nib引用的图像)带标识符......")。具体来说,我认为我的问题是由于在Interface Builder中复制并粘贴了UIButton。我已经删除了这个按钮。
如何解决此问题?
当我在导致此问题的唯一模拟设备上运行程序时,我在控制台上获得以下输出:
2014-03-16 16:35:54.922 iSparse[3743:60b]
(lldb)
(lldb) p idx[0]
(int) $0 = 35353
(lldb) p idx[1]
(int) $1 = 17508
(lldb) p colorPlane[0]
(float) $2 = 218
(lldb) p y_r[0]
(float) $3 = 0
(lldb) p y_r[1]
(float) $4 = 0
这告诉我idx
和colorPlane
似乎是有效的数组,并且由于y_r
未填充像素值,因此该行代码未执行。
发生此错误的函数是
-(void)makeMeasurements2:(UIImage *)image atRate:(float)rate
red:(float *)y_r green:(float *)y_b blue:(float *)y_g
ofLength:(int)length idx:(int *)idx{
// vDSP_vgathr is equivalent to a[i] = b[c[i]] (!)
int pix = image.size.height * image.size.width;
float * array = (float *)malloc(sizeof(float) * pix * 4);
float * colorPlane = (float *)malloc(sizeof(float) * pix);
// get data
[self.dwt imageToRawArray:image into:array pix:length];
int n;
// perform wavelet, 2D on image
// using color planes, all of that
// vDSP_vgathr is the equivalent of a[i] = b[c[i]]
for (n=0; n<3; n++) {
// copy from "array", which is RGBA,RGBA,RGBA...
// and get the colorplane out
cblas_scopy(pix, array+n, 4, colorPlane, 1);
// the do-what-you-want code should go here.
if (n == 0) {
vDSP_vgathr(colorPlane, (const vDSP_Length *)idx, 1, y_r, 1, (int)(rate*pix));
}
if (n == 1) {
vDSP_vgathr(colorPlane, (const vDSP_Length *)idx, 1, y_b, 1, (int)(rate*pix));
}
if (n == 2) {
vDSP_vgathr(colorPlane, (const vDSP_Length *)idx, 1, y_g, 1, (int)(rate*pix));
}
cblas_scopy(pix, colorPlane, 1, array+n, 4);
}
catlas_sset(pix, 255, array+3, 4);
image = [self.dwt UIImageFromRawArray:array image:image forwardInverseOrNull:@"null"];
free(array);
free(colorPlane);
它在for循环中的第一个vDSP_vgathr
失败。