Главная
Блог разработчиков phpBB
 
+ 17 предустановленных модов
+ SEO-оптимизация форума
+ авторизация через соц. сети
+ защита от спама

Метаклассы в Objective-C

Anna | 2.07.2014 | нет комментариев

Данная статья представляет собой перевод статьи What is a meta-class in Objective-C? 

Перевод является авторским. Незначительные дополнения в основном касаются документации Apple и добавлены экстраординарно для комфорта уважаемых читателей. При копировании перевода статьи ссылка на оригинал перевода непременна. Давайте будем уважать объединенный труд.

Малое введение

Давайте испробуем разглядеть такое представление языка Objective-C как метакласс.
Как и любому новичку, решившему учить Objective-C, мне стала любознательна одна деталь.
Если класс единовременно является объектом и мы можем отправлять ему сообщения, вызывающие способ класса (перед типом возвращаемого значения стоит ” “), то что же из себя представляет такой класс-объект?

Для начала припомним, чем отличается способ класса от способа экземпляра.

@interface MyClass : NSObject

  (void)aClassMethod;                               //метод класса
- (void)anInstanceMethod;                          //метод экземпляра
@end
.................................................
[MyClass aClassMethod];                            //вызываем способ класса   (void)aClassMethod;

MyClass *object = [[MyClass alloc] init];    //создаем экземпляр класса MyClass
[object anInstanceMethod];                         //вызываем способ экземпляра - (void)anInstanceMethod; 

Как видим, для вызова способа класса не необходимо создавать обособленный экземпляр класса. При отправке сообщения довольно указать имя класса.

Создание класса вручную в run-time

Выходит, всякий класс в языке Objective-C имеет свой соответствующий метакласс. Давайте разглядим метаклассы в ран-тайме.
Сотворим вручную класс в рантайме.
Дальнейший код создает подкласс RuntimeErrorSubclass надкласса NSError и добавляет к нему способ report.

Class newClass =
    objc_allocateClassPair([NSError class], "RuntimeErrorSubclass", 0);
class_addMethod(newClass, @selector(report), (IMP)ReportFunction, "v@:");
objc_registerClassPair(newClass);

Добавленный с поддержкой функции class_addMethod способ report использует функцию ReportFunction (imp— это указатель на функцию, которая является имплементацией нового способа. Функция должна принимать как минимум два параметра — self и _cmd), имеющая следующее определение:

void ReportFunction(id self, SEL _cmd)
{
    NSLog(@"This object is %p.", self);
    NSLog(@"Class is %@, and super is %@.", [self class], [self superclass]);

    Class currentClass = [self class];
    for (int i = 1; i < 5; i  )
    {
        NSLog(@"Following the isa pointer %d times gives %p", i, currentClass);
        currentClass = object_getClass(currentClass);
    }

    NSLog(@"NSObject's class is %p", [NSObject class]);
    NSLog(@"NSObject's meta class is %p", object_getClass([NSObject class]));
}

Наружно все выглядит довольно легко. Каждого за три шага мы сделали класс.
1. Сделали класс с поддержкой objc_allocateClassPair
2. Добавили к нему способ с поддержкой class_addMethod (При желании дозволено добавит и переменные с поддержкой class_addIvar)
3. Зарегистрировали класс для вероятности работы с ним с поддержкой objc_registerClassPair

В тоже время, появляется вопрос: А что же такое «class pair»? Безусловно, если заглянуть в документацию Apple и посмотреть на изложение функции objc_allocateClassPair, то дозволено увидеть, что она создает не только класс, но и наш загадочный метакласс. Вот и пара классов.
Но для того, Дабы вникнуть в представление метакласса, потребуется знакомство с некоторыми основами.

Когда конструкция данных может быть рассмотрена как объект

У всякого объекта есть класс. Это фундаментальное представление объектно-ориентированного программирования, но в Objective-C это также значимая часть конструкции данных. Любая конструкция данных, имеющая указа

Источник: programmingmaster.ru

Оставить комментарий
Форум phpBB, русская поддержка форума phpBB
Рейтинг@Mail.ru 2008 - 2017 © BB3x.ru - русская поддержка форума phpBB