Является ли 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, который имеет такую ​​слабую типизацию; он позволяет сохранять общие указатели объектов и отправлять им произвольные сообщения.