Aggiungi variabile @property ad una categoria in Objective-C

Oggi avevo bisogno di aggiungere una proprietà NSString * alla mia categoria personalizzata. Così come di consueto ho esteso da UIView. In particolare, necessitavo di aggiungere la proprietà details ad alcune UIView che non l’avevano. Sarebbe stato scomodissimo creare una nuova classe, ereditare, dopodiché modificare tutti gli oggetti istanziati.

category-overview

Come? 
Crea la tua categoria, con tutte le proprietà che desideri! 
Attualmente nelle categorie non è possibile utilizzare @syntetize ma è necessario usare @dynamic per creare i metodi getter e setter personalizzati.

Nel file di intestazione UIView+Description.h:

#import <objc/runtime.h>

@interface UIView (Description)

@property (nonatomic, strong) NSString *details;

-(NSString *)details;
-(void)setDetails:(NSString *)details;

Invece, nel file di implementazione UIView+Description.m:

#import "UIView+Description.h"

static char const * const detailsKey = "details";

@implementation UIView (Description)
@dynamic details;

-(void)setDetails:(NSString *)details{
 objc_setAssociatedObject(self, detailsKey, (id)details, OBJC_ASSOCIATION_ASSIGN);
}

-(NSString *)details{
 return (NSString *)objc_getAssociatedObject(self, detailsKey);
}

PS: ricorda di importare il file runtime.h

È inoltre possibile specificare il criterio associazione basato sulla vostra proprietà:  Associative Object Behaviors

enum {
 OBJC_ASSOCIATION_ASSIGN = 0,
 OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
 OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
 OBJC_ASSOCIATION_RETAIN = 01401,
 OBJC_ASSOCIATION_COPY = 01403
};
  • OBJC_ASSOCIATION_ASSIGN
    Specifica un riferimento weak per l’oggetto associato.
  • OBJC_ASSOCIATION_RETAIN_NONATOMIC
    Specifica un riferimento strong all’oggetto associato, e che l’associazione non è fatta atomicamente.
  • OBJC_ASSOCIATION_COPY_NONATOMIC
    Specifica che l’oggetto associato viene copiato, e che l’associazione non è fatta atomicamente.
  • OBJC_ASSOCIATION_RETAIN
    Specifica un riferimento strong all’oggetto associato, e che l’associazione è fatta in modo atomico.
  • OBJC_ASSOCIATION_COPY
    Specifica che l’oggetto associato viene copiato, e che l’associazione è fatta in modo atomico.

questo è tutto.

Ora è possibile utilizzare la nostra proprietà in tutti gli oggetti che ereditano UIView!

{
...

myObject.details = @"Informazioni...";

...
}