Является ли id "корневым типом" или просто типом?
Многие разработчики Objective-C, как начинающие, так и опытные, как представляется, считают id
как будто это какой-то магический тип catch-all, который вы можете передать объекту и отправить любое старое сообщение без последствий (из компилятора, как минимум). Но, когда вы действительно смотрите определение id
, это не более чем указатель на objc_object
. Таким образом, это буквально "объект Objective-C", но ничто не может "спуститься" с id
. Даже заголовок NSObject выглядит не так:
@interface NSObject : id
Он просто читает:
@interface NSObject
Теперь я твердо уверен, что нейтральный тип id
является побочным эффектом его реализации, но поскольку есть те, которые все еще думают иначе, я должен спросить:
Что такое первичная функция типа id
?
Ответы
Ответ 1
id
- это всего лишь общий указатель объекта, как вы уже нашли. Поскольку это не класс, ничто не может наследовать от него. NSObject
, строго говоря, не является частью языка Objective-C, а является частью конкретной реализации.
id
удобен для языка, такого как Objective-C, который имеет такую слабую типизацию; он позволяет сохранять общие указатели объектов и отправлять им произвольные сообщения.