Запуск кода возвращает мусор; ввод в отладчике возвращает правильный результат - PullRequest
1 голос
/ 05 марта 2011

Вот код, после которого я устанавливаю точку останова (я добавил приведенные значения к точно , совпадающим с тем, что я набрал в 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 ()

Ответы [ 2 ]

2 голосов
/ 05 марта 2011

Похоже, вы не выполняете следующую проверку, которую вам нужно сделать перед использованием addRefOrder.

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

Если это NSNotFound, то это не мусорное значение, и я бы не стал подвергать сомнению этот результат и не вызывал бы отладчик, прежде чем искать в другом месте кода. Что заставляет вас думать, что это неправильно? Обычно это наша вина. Возможно, вы упустили из виду некоторую проблему с вашей логикой, выходящую за рамки этого фрагмента кода.

Если вышеприведенное верно, сделайте обзор своего кода, чтобы выяснить, почему его не будет в массиве.

Одна вещь, которую нужно проверить, это ваша реализация isEqual: для класса объекта AddedRef. Потому что именно так массив определяет, находится объект в массиве или нет.

Также я бы не стал доверять результату первой строки в отладчике. Вы только что вызвали все эти методы во второй раз, и в этих вызовах может произойти все, что может повлиять на возвращаемое значение. Возможно, во второй раз, когда вы вызываете его, он на самом деле находится в массиве из-за некоторого побочного эффекта.

Это также может быть проблема параллелизма, которую вы легко сможете исключить, если не используете потоки. Если да, то я бы посмотрел на обычных подозреваемых.

0 голосов
/ 30 марта 2011

Оказывается, проблема была в том, что x и y были типа NSInteger, и компилятору не удавалось удерживать их прямо от некоторых других методов CGFloat x и y.*

В конце концов, решением было явное приведение currentObject к правильному типу.

...