2011-03-05 79 views
1

这里之后,我设置一个断点的代码(我加入了强制类型究竟比赛我在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

原来的问题是,xyNSInteger类型,而编译器遇到了麻烦,从其他CGFloatxy方法保持平直。

最后的解决方案是明确地将currentObject转换为正确的类型。

2

看来你没有做以下检查,您使用addedRefOrder之前需要。

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

如果是NSNotFound,那么它是不是垃圾价值,我不会质疑这个结果并在代码跳槽之前打出来的调试器。是什么让你觉得这是不对的?通常这些事情是我们自己的错。您可能忽略了此代码段范围之外的逻辑问题。

如果以上情况属实,请检查您的代码以确定它为什么不在数组中。

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

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

它也可能是一些并发问题,如果你不使用线程,你应该能够轻松排除。如果你是那么我会看那里的通常的嫌疑人。

+0

该对象位于数组中。 – andyvn22 2011-03-11 00:13:30