antonio's blog

antonio's blog


Блог о всяком разном, связанном с разработкой ПО. Пишу редко, когда есть время и желание.

antonio
Author

Share


Tags


Переменные экземпляра с помощью категории в Objective-C

antonioantonio

Бывает к существующему классу необходимо добавить переменные экземпляра, в категории objective-c нельзя определить переменные экземпляра. Нельзя определить прямым способом, но можно воспользоваться функциями runtime библиотеки.

Рассмотри создание переменных экземпляра на примере. Создадим категорию расширяющую класс NSString, у категории будет одно свойство - MyProperty, значение которого мы будем сохранять в объекте с помощью связанной ссылки:

@interface NSString (MyProperty)
@property(assign, nonatomic) NSInteger myProperty;
@end</code>
<code>static NSString *propertyKeyName = @"kMyProperty";

@implementation NSString (MyProperty)

- (void)setMyProperty:(NSInteger)propertyValue {
    objc_setAssociatedObject(self, propertyKeyName, [NSNumber numberWithInteger:propertyValue], OBJC_ASSOCIATION_ASSIGN);
}

- (NSInteger)myProperty {
    id propertyValue = objc_getAssociatedObject(self, propertyKeyName);
    return ((NSNumber *)propertyValue).intValue;
}
@end

Для доступа к значению свойства мы реализуем методы доступа - сеттер и геттер. В сеттере, с помощью функции objc_setAssociatedObject(), создается связанная ссылка. В геттере, с помощью функции objc_getAssociatedObject() мы извлекаем значение, связанное с объектом по ключу. Извлекаемое значение также является объектом.

objc_setAssociatedObject() и objc_getAssociatedObject() - функции времени выполнения Objcetive-C.

Функция objc_setAssociatedObject() создает связь между двумя объектами. Прототип функции:

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

Функция принимает четыре параметра:

Функция objc_getAssociatedObject() возвращает значение связанное с указанным объектом и ключом. Прототип функции:

id objc_getAssociatedObject(id object, void *key) - принимает два параметра:

Для удаления связанной ссылки необходимо вызвать функцию objc_setAssociatedObject(), передав в качестве значения третьего параметра nil:

objc_setAssociatedObject(self, propertyKeyName, nil, OBJC_ASSOCIATION_ASSIGN);  

Для удаления все связанных ссылок с объектом вызовите функцию objc_removeAssociatedObjects(). Функция принимает один аргумент - объект для которого создавались связанные ссылки

Associative References

antonio
Author

antonio

Comments