Objective c 运行代码返回垃圾;在调试器中键入返回正确的结果

Objective c 运行代码返回垃圾;在调试器中键入返回正确的结果,objective-c,cocoa,debugging,gdb,Objective C,Cocoa,Debugging,Gdb,下面是我设置断点之后的代码(我添加了强制转换以完全匹配我在GDB中键入的内容,但没有它们时结果相同): 以下是我在GDB中键入的内容: (gdb) print (NSUInteger)[(NSArray*)[sourceMap tileRefsAtX:[addedRef x] y:[addedRef y]] indexOfObject:addedRef] $2 = 1 (gdb) print addedRefOrder $3 = 9223372036854775807 作为记录,我相当肯定后一

下面是我设置断点之后的代码(我添加了强制转换以完全匹配我在GDB中键入的内容,但没有它们时结果相同):

以下是我在GDB中键入的内容:

(gdb) print (NSUInteger)[(NSArray*)[sourceMap tileRefsAtX:[addedRef x] y:[addedRef y]] indexOfObject:addedRef]
$2 = 1
(gdb) print addedRefOrder
$3 = 9223372036854775807
作为记录,我相当肯定后一个值是
NSNotFound
。这个问题究竟意味着什么?我怎么开始调试这个呢

编辑:我确定对象在数组中<返回code>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 ()

似乎您没有执行以下检查,在使用addedRefOrder之前,您需要执行以下检查

if (addedRefOrder == NSNotFound) {
   NSLog(@"Object %@ not found in array %@", addedRef, array);
}
如果它是NSNotFound,那么它就不是垃圾值,在查找代码中的其他地方之前,我不会质疑这个结果并中断调试器。你凭什么认为这不对?通常这些都是我们自己的错。您可能忽略了此代码段范围之外的逻辑问题

如果上述情况属实,请检查您的代码,找出它不在数组中的原因

需要检查的一件事是isEqual的实现:对于addedRef对象的类。因为这就是数组确定对象是否在数组中的方式

我也不相信调试器中第一行的结果。您刚刚第二次调用了所有这些方法,这些调用中可能会发生任何影响返回值的事情。也许第二次调用它时,由于一些副作用,它实际上在数组中


这也可能是一些并发性问题,如果不使用线程,您应该能够轻松地排除这些问题。如果你是这样的话,我会看看那些常见的嫌疑犯。

事实证明,问题是
x
y
属于
NSInteger
类型,而编译器很难将它们与其他
CGFloat
x
y
方法区分开来

最终的解决方案是将
currentObject
显式转换为正确的类型

if (addedRefOrder == NSNotFound) {
   NSLog(@"Object %@ not found in array %@", addedRef, array);
}