2010-10-13 2 views
3

Можно создать дубликат:
objective c difference between id and void *В чем разница между void * и id?

Например, UIView анимации метод делегата обратного вызова имеет этот аргумент:

context:(void*)context 

Почему не просто идентификатор? Я всегда передаю ноль, если мне не нужен контекст. Но когда я хочу его, я передаю объект. Какая разница? Почему они предпочитают void * over id?

+3

Отличный вопрос, но это уже было задано. Хорошая новость заключается в том, что она уже исправлена: http://stackoverflow.com/questions/1304176/objective-c-difference-between-id-and-void/1304277#1304277 –

ответ

7

id является указателем на структуру, которая имеет указатель isa (который обозначает время выполнения ObjectiveC, что эта «вещь» является объектом). void* - это просто указатель на возможно что угодно (возможно, еще один id).

2

Это позволит вам передать указатель на все, что угодно. Может быть объектом obj-c, указателем на некоторый массив, структурой, любым. Тип void * - это всего лишь самый общий тип «ничего».

Если вы просто проходите мимо, не беспокойтесь об этом. Вместо этого вы можете передать NULL, если вам станет лучше.

2

Я думаю, вы спрашиваете нечто большее, чем разница между id и void *. Кажется, вы спрашиваете, почему в этом случае это недействительно.

Это недействительно *, потому что это ваш указатель. Никто, но вы будете использовать это. Этот указатель не будет сохранен или иным образом использован. Когда анимация вызовет ваш метод обратного вызова, он вернет этот указатель вам нетронутым. То, что вы делаете с этим, зависит от того, что вы вкладываете в контекст: в первую очередь.

Будучи пустотой, вы можете делать много вещей. Вы можете перейти в стандартный объект объектива-c. Вы можете передать простую структуру данных стиля С. Вы можете передать указатель на функцию. Вы могли бы пропустить ноль и ничего не делать.