2010-01-12 2 views
2

У меня есть следующий код:Как записывать данные и тип из указателя пустоты?

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 
    ... 

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

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

+0

Найдено вопрос в объектах, переданных через пустоту *. Их модификатор свойства был настроен как назначенный, когда он должен был быть сохранен. Таким образом, ссылка указателя была утеряна/недействительна к моменту поступления кода NSLog. – Greg

ответ

2

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

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

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

+0

Спасибо за совет! – Greg

1

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

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

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

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

+0

Спасибо за совет! – Greg