Метод класса может вызываться с помощью отправки сообщения непосредственно имени класса.

Например, метод класса familyNames из класса UIFont, о котором я говорил выше, может быть вызван следующим образом:

NSArray* fams = [UIFont familyNames];

Понятно, что это возможно потому, что класс является объектом (глава 2), и здесь имя класса представляет этот объект.

Вы не должны делать ничего для создания объекта класса. Один объект класса для каждого класса, определенного в вашей программе, создается автоматически при запуске программы. (Сюда входят и классы, импортируемые вашей программой, так что существует объект класса MyClass, поскольку вами определен MyClass, и объект класса NSString, поскольку вы импортируете UIKit .h и весь каркас Cocoa.) Именно этому объекту и посылаются сообщения, когда вы отправляете их имени класса.

Способность послать сообщение непосредственно имени класса представляет собой своего рода синтаксическую стенографию. “Голое” имя класса можно использовать только двумя способами (и мы уже знаем их оба).

Для отправки сообщения

В выражении [UIFont familyNames] сообщение familyNames отправляется имени

Для указания типа экземпляра

В выражении NSString* имя NSString, за которым следует звездочка, определяет указатель на экземпляр этого класса.

В противном случае, чтобы говорить об объекте класса, необходимо формально получить этот объект. Один из способов сделать это заключается в том, чтобы отправить сообщение class классу или экземпляру. Например, [MyClass class] возвращает действительный объект класса. Некоторые встроенные методы каркаса Cocoa требуют в качестве параметра объект класса, тип которого описывается как Class. Для того чтобы передать этот объект класса в качестве аргумента, необходимо формально получить его.

Рассмотрим, например, анализ объектом класса, к которому он принадлежит. Метод экземпляра isKindOfClass : объявлен следующим образом:

- (BOOL)isKindOfClass:(Class)aClass

Это означает, что его можно вызвать с помощью следующего кода:

if ([someObject isKindOfClass: [MyClass class]]) // ...

Объект класса не является экземпляром, но он определенно представляет собой полноправный объект. Следовательно, объект класса можно использовать везде, где может использоваться объект. Например, его можно присвоить переменной типа id:

id classObject = [MyClass class];

Затем вы можете вызвать метод класса, отправляя сообщение этому объекту, поскольку он является объектом класса:

id classObject = [MyClass class];
[classObject someClassMethod];

Все объекты класса являются также членами класса Class, так что вы можете написать следующий код:

Class classObject = [MyClass class];
[classObject someClassMethod];

Эти примеры будут компилироваться до тех пор, пока someClassMethod представляет собой известный метод класса любого класса.

Ссылка на объект является указателем (глава 3). Это верно и для ссылки на объект класса так аее, как и для ссылки на экземпляр. Подобно id, термин Class типизирован как указатель, так что вам не надо использовать с ним звездочку.

 

Глобальное пространство имен

Определяя классы, для предотвращения конфликтов имен разумно выбирайте имена классов. В языке Objective-C нет пространства имен; есть одно огромное пространство имен, содержащее все имена. Нежелательно, чтобы имя вашего собственного класса (или любое имя константы верхнего уровня) совпадало с именем, определенным в каркасе Cocoa. Вместо пространства имен имеется соглашение: каждый каркас Cocoa добавляет к именам в качестве префиксов определенную группу из прописных букв (NSString и NSArray, CGFloat и CGRect и т.д.). Компания Apple предлагает вам также использовать свой собственный префикс; в действительности, когда вы создаете новый проект в среде Xcode, вам будет предложена возможность задать префикс, который будет отображаться перед автоматически создаваемыми именами классов. Не используйте никакой из префиксов компании Apple! Ничто не ограничивает ваш префикс двумя буквами, как и не требует, чтобы буквы были прописными. Фактически, поскольку Apple использует в префиксах только прописные буквы, "Му" в качестве префикса оказывается достаточно безопасным.


Похожие статьи

 

 

 

Добавить комментарий