Как регистрировать данные и вводить из пустого указателя? - PullRequest
2 голосов
/ 12 января 2010

У меня есть следующий код:

eachShape(void *ptr, void* unused) {
  cpShape *shape = (cpShape *) ptr;
  id obj = shape->data;
  NSLog(@"shape->data: %@", obj);  // this is where EXC_BAD_ACCESS can occur
  ...

Некоторые из вас могут узнать это по физическим фишкам Бурундука, которые использовались при разработке iPhone. По сути, здесь происходит сбой из-за того, что я делаю в другом коде, касающемся cpSpace, но я хочу выяснить, какой тип объекта отправляется сюда и приводит к сбою моего оператора NSLog (и вызывает другой хаос).

Каков наилучший способ вывести тип и / или содержимое из пустого указателя на вызов NSLog?

Ответы [ 2 ]

2 голосов
/ 12 января 2010

Я думаю, что ваша проблема в том, что %@ имеет смысл только в том случае, если shape->data действительно указывает на объект Objective-C, поскольку его использование вызывает отправку -description в obj.Но если, например, shape->data указывает на int, сообщение будет отправлено объекту, который на самом деле не существует.Вместо этого некоторая область памяти может быть интерпретирована как необработанные байты объекта, что приводит к сбою среды выполнения.

Чтобы ответить на ваш вопрос: тип указателя void равен void *, а тип указателяцель void.Вы можете напечатать значение указателя с помощью %p, но я сомневаюсь, что это именно то, что вам нужно.

Так что, если вы уверены, что область памяти, на которую указывает shape->data, представляет объект Objective-C, иу вас есть доступ к коду класса, вы можете переопределить -description для печати любой информации, которая вам нравится.

1 голос
/ 12 января 2010

Спецификатор формата %@ интерпретируется как

Объект Objective C, напечатанный как строка, возвращенная descriptionWithLocale:, если доступно, или description в противном случае. Также работает с CFTypeRef объектами, возвращая результат функции CFCopyDescription.

По сути, если ptr не указывает на объект Objective-C, вам не повезло!

В любом случае, вы должны привести void * указатель к чему-то значимому.

...