Объект класса в Objective C - PullRequest
       1

Объект класса в Objective C

0 голосов
/ 18 декабря 2009

Я перехожу с Java на Objective C, и идея объекта класса заставляет меня задуматься о сходстве с Java. Из руководства Objective C в документации Apple:

Информация определения класса компилируется и записывается в структурах данных, доступных для систем выполнения. Компилятор создает только один объект, объект класса , для представления класса.

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

Для сравнения, у JVM есть подобный объект для всех классов, которые он загружает?

Ответы [ 3 ]

9 голосов
/ 18 декабря 2009

Учитывая, что Java была получена непосредственно из Objective-C (нет, на самом деле, так и было), модели времени выполнения этих двух очень похожи.

В Java понятие «класс» не такое общее, как в Objective-C.

В Objective-C класс является экземпляром того, что известно как метакласс. Для всех намерений и целей каждый объект Class в Objective-C делает именно так, как вы говорите; он описывает конкретный класс, доступный во время выполнения Objective C.

То же самое концептуально верно для классов Java. Есть одно ключевое отличие. В Objective-C методы класса наследуются по подклассам, и более значительно подкласс может переопределять метод (ы) класса суперкласса.

Например, класс NSArray реализует метод класса +array («+» означает «метод класса»). Подкласс NSMutableArray из NSArray переопределяет +array, чтобы вместо него возвращать изменяемый экземпляр.

java.lang.Class больше похож на API-интерфейс Objective-C; это механизм, с помощью которого вы анализируете классы, доступные во время выполнения. Поскольку Java не имеет функционального API, API упакован в класс с соответствующим именем. java.lang.Class - это своего рода API времени выполнения и метакласс все в одном.

4 голосов
/ 18 декабря 2009

Сопоставимая структура в Java будет java.lang.Class .

1 голос
/ 18 декабря 2009

Я думаю, что для каждого класса есть объект класса.
Этот объект класса является тем, который на низком уровне используется для функций как class_getName(), class_getSuperclass(), class_getVersion(), class_respondsToSelector(). Если бы был один объект класса для всех классов, то эти функции возвращали бы один и тот же результат для всех классов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...