Szukaj…


Wprowadzenie

Po raz pierwszy wprowadzone w iOS 3.1 jako część środowiska wykonawczego Objective-C, powiązane obiekty zapewniają sposób dodawania zmiennych instancji do istniejącego obiektu klasy (bez podklasy).

Oznacza to, że będziesz mógł dołączyć dowolny obiekt do dowolnego innego obiektu bez podklasy.

Składnia

  • void objc_setAssociatedObject (obiekt id, klucz void *, wartość identyfikatora, polityka objc_AssociationPolicy)

  • id objc_getAssociatedObject (obiekt id, klucz void *)

  • void objc_removeAssociatedObjects (obiekt id)

Parametry

Param Detale
obiekt Istniejący obiekt, który chcesz zmodyfikować
klucz Zasadniczo może to być dowolny wskaźnik, który ma stały adres pamięci, ale dobrą praktyką jest użycie tutaj obliczonej właściwości (gettera)
wartość Obiekt, który chcesz dodać
polityka Polityka pamięci dla tej nowej value tj. Czy należy ją zachować / przypisać, skopiować itp., Podobnie jak każdą inną właściwość, którą zadeklarujesz

Uwagi

Więcej informacji tutaj:

NSHipster

@kostiakoval

kingscocoa

Przykład podstawowego obiektu powiązanego

Załóżmy, że musimy dodać obiekt NSString do SomeClass (nie możemy podklasy).

W tym przykładzie nie tylko tworzymy powiązany obiekt, ale również zawijamy go do obliczonej właściwości w kategorii w celu zapewnienia dodatkowego porządku

#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));
}

Teraz korzystanie z tej właściwości będzie tak proste

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
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow