iOS
Связанные объекты Objective-C
Поиск…
Вступление
Впервые представленный в iOS 3.1 как часть среды выполнения Objective-C, связанные объекты предоставляют способ добавления переменных экземпляра в существующий объект класса (w \ o subclassing).
Это означает, что вы сможете присоединить любой объект к любому другому объекту без подкласса.
Синтаксис
void objc_setAssociatedObject (id object, void * key, id value, objc_AssociationPolicy policy)
id objc_getAssociatedObject (id object, void * key)
void objc_removeAssociatedObjects (объект id)
параметры
Param | подробности |
---|---|
объект | Существующий объект, который вы хотите изменить |
ключ | В основном это может быть любой указатель, который имеет постоянный адрес памяти, но хорошей практикой является использование здесь вычисленного свойства (getter) |
значение | Объект, который вы хотите добавить |
политика | Политика памяти для этого нового value т. Е. Должна быть сохранена / назначена, скопирована и т. Д. Точно так же, как любое другое свойство, которое вы объявили |
замечания
Пример базового ассоциированного объекта
Предположим, нам нужно добавить объект NSString к SomeClass
(мы не можем подкласса).
В этом примере мы не только создаем связанный объект, но и переносим его в вычисленное свойство в категории для дополнительной аккуратности
#import <objc/runtime.h>
@interface SomeClass (MyCategory)
// This is the property wrapping the associated object. below we implement the setter and getter which actually utilize the object association
@property (nonatomic, retain) NSString *associated;
@end
@implementation SomeClass (MyCategory)
- (void)setAssociated:(NSString *)object {
objc_setAssociatedObject(self, @selector(associated), object,
OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
- (NSString *)associated {
return objc_getAssociatedObject(self, @selector(associated));
}
Теперь было бы так просто, как использовать свойство
SomeClass *instance = [SomeClass alloc] init];
instance.associated = @"this property is an associated object under the hood";