Являются ли классы объектами в Objective-C?

#objective-c #macos #cocoa #class #metaclass

#objective-c #macos #cocoa #класс #метакласс

Вопрос:

хорошо, итак, я понимаю, что объект — это экземпляр класса, который должен быть выделен и инициализирован, но являются ли сами классы объектами?

Я знаю, что когда вы создаете новый класс, это экземпляр чего-то другого, например NSObject. Итак, если это делает его классом, то объекты могут содержать не только переменные и методы, но и другие объекты, верно?

Извините, это, вероятно, действительно базово, но я читаю две книги о cocoa и xcode, и этот момент немного неясен (вероятно, из-за отсутствия у меня опыта работы с другими языками).

Комментарии:

1. Я думаю, вы говорите о мета-классах? cocoawithlove.com/2010/01 /…

Ответ №1:

Вот довольно хорошее объяснение этого вопроса от Грега Паркера

Цитирование:

[…] Каждый класс Objective-C также является объектом. У него есть указатель isa и другие данные, и он может реагировать на селекторы. Когда вы вызываете «метод класса», такой как [NSObject alloc], вы фактически отправляете сообщение этому объекту класса.

Поскольку класс является объектом, он должен быть экземпляром какого-то другого класса: метакласса. Метакласс — это описание объекта класса, точно так же, как класс — это описание обычных экземпляров. В частности, список методов метакласса — это методы класса: селекторы, на которые реагирует объект класса. Когда вы отправляете сообщение классу — экземпляру метакласса — objc_msgSend() просматривает список методов метакласса (и его суперклассов, если таковые имеются), чтобы решить, какой метод вызывать. Методы класса описываются метаклассом от имени объекта класса, точно так же, как методы экземпляра описываются классом от имени объектов экземпляра.

Что насчет метакласса? Это метаклассы до конца? Нет. Метакласс является экземпляром метакласса корневого класса; корневой метакласс сам по себе является экземпляром корневого метакласса. Цепочка isa заканчивается здесь циклом: экземпляр класса переходит в метакласс, а корневой метакласс переходит к самому себе. Поведение указателей isa метакласса редко имеет значение, поскольку в реальном мире никто не отправляет сообщения объектам метакласса. […]

Дальнейшие интересные чтения:

Понимание среды выполнения Objective-C Колином Уилером
(найдите абзац под названием «Итак, классы определяют объекты …»)

Что такое метакласс в Objective-C? Мэтт Галлахер