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.
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:
[code lang=”obj-c”]
#import <objc/runtime.h>
@interface UIView (Description)
@property (nonatomic, strong) NSString *details;
-(NSString *)details;
-(void)setDetails:(NSString *)details;
[/code]
Invece, nel file di implementazione UIView+Description.m:
[code lang=”obj-c”]
#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);
}
[/code]
PS: ricorda di importare il file runtime.h
È inoltre possibile specificare il criterio associazione basato sulla vostra proprietà: Associative Object Behaviors
[code lang=”obj-c”]
enum {
OBJC_ASSOCIATION_ASSIGN = 0,
OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
OBJC_ASSOCIATION_RETAIN = 01401,
OBJC_ASSOCIATION_COPY = 01403
};
[/code]
- 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!
[code lang=”obj-c”]
{
…
myObject.details = @"Informazioni…";
…
}
[/code]