Поиск…


Вступление

Впервые представленный в 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 т. Е. Должна быть сохранена / назначена, скопирована и т. Д. Точно так же, как любое другое свойство, которое вы объявили

замечания

Подробнее здесь:

NSHipster

@kostiakoval

kingscocoa

Пример базового ассоциированного объекта

Предположим, нам нужно добавить объект 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";



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow