Добрый день. Не так давно передо мной встала задача добавить свойство к уже существующему классу(у меня это был UIButton) начал искать, и на странице эплов нашел то, что мне было нужно. А теперь подробнее, что же именно я там нашел.

В Objective-C есть такая замечательная вещь как рантайм он позволяет творить чудеса, если знать как этим пользоваться. Эту возможность я тут и буду использовать.

Сначала необходимо добавить в проект файл категории для требуемого объекта, в итоге если категория называется AddProperty, а целевой класс UIButton, то название файла будет таким: UIButton+AddProperty.

Далее, в файл UIButton+AddProperty.h пишем следующее:

@interface UIButton (AddProperty)
@property(retain,nonatomic) NSString* someText; // добавляемое свойство
@end

Тут все понятно, теперь нужно синтезировать это свойство, обычным способом этого не сделать. Переходим в файл UIButton+AddProperty.m, подключаем заголовочный файл #import . Среди все прелестей доступных нам после подключения этого файла, в данный момент нас интересуют следующие две функции:

void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)

id objc_getAssociatedObject(id object, const void *key)

в целом, я думаю понятно что они делают.

Сейчас приведу рабочий код с этими функциями, а затем разберем все:

#import «UIButton+AddProperty.h»
#import

static NSString* keyProperty = @»keySomeTextProperty»;

@implementation UIButton (AddProperty)

-(void) setSomeText:(NSString *)someText{
objc_setAssociatedObject(self, keyProperty, someText, OBJC_ASSOCIATION_RETAIN_NONATOMIC); // устанавливаем пару ключ-значение
}

-(NSString*) someText{
id value = objc_getAssociatedObject(self, keyProperty); // получаем объект по ключу
return (NSString*)value;
}

@end

Теперь подробности:

функция void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)

четыре параметра:

  • object — объект, для которого создается свойство
  • key — ключ, обеспечивающий уникальность свойства, в рамках данного объекта(понятно, что он долежн быть уникален)
  • value — значение свойства
  • policy — политика присовения свойств. На выбор есть несколько вариантов, в зависимости от требуемого эффекта(их можно посмотреть в файле runtime.h):

    OBJC_ASSOCIATION_ASSIGN

    OBJC_ASSOCIATION_RETAIN_NONATOMIC

    OBJC_ASSOCIATION_COPY_NONATOMIC

    OBJC_ASSOCIATION_RETAIN

    OBJC_ASSOCIATION_COPY

    Названия этих констант соответствуют требуемой политики поведения свойств в присвоении объектов.

функция id objc_getAssociatedObject(id object, const void *key)

имеет всего два параметра:

  • object — объект, у которого мы ищем данное свойство
  • key — ключ для поиска

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

Вот в общем-то и все, что необходимо, для того, что бы добавить требуемое свойство в уже существующий класс. Добавление методов к существующему классу тут намеренно не рассматривалось, т.к. этой информации везде хватает, а по поводу добавления свойст ее не особо-то и много, только на stackoverflow нашел что-то внятное, но потом дочитывал на developer.apple.com откуда и была взята основная информация.

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *