以下是我设置断点的代码(我将完全的强制转换与我在GDB中输入的内容相匹配,但没有它们的结果相同):
NSUInteger addedRefOrder = (NSUInteger)[(NSArray*)[sourceMap tileRefsAtX:[addedRef x] y:[addedRef y]] indexOfObject:addedRef];
这是我在GDB中输入的内容:
(gdb) print (NSUInteger)[(NSArray*)[sourceMap tileRefsAtX:[addedRef x] y:[addedRef y]] indexOfObject:addedRef]
$2 = 1
(gdb) print addedRefOrder
$3 = 9223372036854775807
为了记录,我很确定后一个值是NSNotFound
。这个问题到底意味着什么呢?我怎么开始调试这个?
NSNotFound
已退回,但不正确。这是同一个应用程序中其他地方的另一种情况:
NSPoint irisPoint = NSMakePoint([currentObject x], [currentObject y]);
该行之后的断点:
(gdb) print irisPoint
$1 = {
x = 4301764096,
y = 4301764096
}
(gdb) print [currentObject x]
$2 = 4
(gdb) print NSMakePoint([currentObject x], [currentObject y])
Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x0000000000000018
0x00007fff885e010a in objc_msgSend ()
答案 0 :(得分:2)
在使用addedRefOrder之前,您似乎没有进行以下检查。
if (addedRefOrder == NSNotFound) {
NSLog(@"Object %@ not found in array %@", addedRef, array);
}
如果它是NSNotFound,那么它不是垃圾值,我不会质疑这个结果并在查找代码中的其他地方之前打破调试器。是什么让你认为这不对?通常这些都是我们自己的错。您可能忽略了此代码段范围之外的逻辑问题。
如果上述情况属实,请检查您的代码,找出它不在数组中的原因。
要检查的一件事是你的isEqual实现:对于addedRef对象的类。因为这就是数组如何确定对象是否在数组中。
另外,我不相信调试器中第一行的结果。您刚刚第二次调用了所有这些方法,并且可能会在那些会影响返回值的调用中发生任何事情。也许你第二次调用它时,由于某些副作用,它实际上是在数组中。
它也可能是一些并发问题,如果你不使用线程,你应该可以轻松排除。如果你那时我会看那里常见的嫌犯。
答案 1 :(得分:0)
事实证明问题是x
和y
属于NSInteger
类型,并且编译器无法将其与其他CGFloat
{{1}保持一致}和x
方法。
最终的解决方案是明确地将y
转换为正确的类型。