Интернет магазин китайских планшетных компьютеров



Компьютеры - Objective-C - Class objects и Objective-C runtime

06 июля 2011


Оглавление:
1. Objective-C
2. Синтаксис языка
3. Создание новых классов
4. Как работает механизм сообщений
5. Протоколы
6. Обработка исключений
7. Создание и уничтожение объектов
8. Управление памятью
9. Категории
10. Class objects и Objective-C runtime
11. Разное



При компиляции программы на языке Objective-C компилятор для каждого введенного класса автоматически создает так называемый class object — полноценный объект, содержащий в себе всю информацию о данном классе, включая название, суперкласс, список методов и instance-переменных.

При этом такой объект является полноценным объектом, то есть ему можно посылать сообщения, передавать в качестве параметра.

Одной из особенностей class object’а является то, что он поддерживает все методы класса NSObject, то есть когда ему посылается сообщение, то вначале идет поиск среди методов класса, а если метод не найден, то поиск продолжается среди instance-методов класса NSObject.

Ещё одной интересной особенностью является возможность инциализации class object’ов — в начале работы приложения каждому class object’у посылается сообщение initialize.

Это сообщение гарантированно посылается каждому class object’у, причем всего один раз и до того, как ему будет послано любое другое сообщение. Простейшим примером применения такого сообщения является реализация Singleton’ов — именно в методе initialize следует создать тот самый единственный экземпляр объекта и запомнить его в static-переменной.

Если посмотреть на Objective-C runtime от Apple, то мы найдем большое количество С-функций, служащих для работы с классами.

Наиболее интересными являются следующие:

Method   class_getInstanceMethod;
Method   class_getClassMethod   ;
struct objc_method_list * class_nextMethodList;
void     class_addMethods       ;
void     class_removeMethods    ;
unsigned method_getNumberOfArguments ;
unsigned method_getSizeOfArguments   ;
unsigned method_getArgumentInfo      ( Method method, int argIndex, const
                                       char ** type, int *  offset );
Ivar     class_getInstanceVariable   ;

Функция class_getInstanceMethod возвращает указатель на структуру, описывающую заданный instance-метод данного класса.

Функция class_getClassMethod возвращает указатель на структуру, описывающую заданный метод данного класса.

Функция class_nextMethodList возвращает один из списков методов для заданного класса. Приводимый ниже фрагмент кода позволяет перебрать все методы для данного класса.

    void                    * iterator = 0;
    struct objc_method_list * methodList;
 
    //
    // Each call to class_nextMethodList returns one methodList
    //
 
    methodList = class_nextMethodList
 
    while 
    {
        // …do something with the method list here…
 
        methodList = class_nextMethodList ;
    }

Функция class_addMethods позволяет добавлять новые методы к заданному классу.

Функция class_removeMethods позволяет убирать методы из заданного класса.

Функция method_getNumberOfArguments Возвращает количество аргументов для заданного метода.

Функция method_getSizeOfArguments возвращает размер места на стеке, занимаемого всеми аргументами данного метода.

Функция method_getArgumentInfo возвращает информацию об одном из аргументов для заданного метода..

Функция class_getInstanceVariable возвращает информацию об instance-переменной класса в виде указателя на структуру objc_ivar.

Для кодирования информации о типах используется специальное строковое представление, однозначно сопоставляющее каждому типу данных некоторую строку. Явно получить такую строку для произвольного типа можно при помощи конструкции @encode.

char * buf1 = @encode ;
char * buf2 = @encode ;
char * buf3 = @encode ;


Просмотров: 11415


<<< Mission Control
Photo Booth >>>