Questa è l'ottava parte della Guida alla programmazione in Objective-C, oggi parleremo di Riferimenti Associativi.
Questo post è una traduzione in italiano della Guida all'Objective C, presente sul sito developer.apple.com a questo link. L'Objective C è il linguaggio di programmazione per creare applicazioni per iPhone. Questo articolo può interessare a tutti gli sviluppatori che vogliono imparare le basi di questo linguaggio che è il fondamento per programmare nuove applicazioni per Mac Os X, iPhone ed iPad.
Questo post è una traduzione in italiano della Guida all'Objective C, presente sul sito developer.apple.com a questo link. L'Objective C è il linguaggio di programmazione per creare applicazioni per iPhone. Questo articolo può interessare a tutti gli sviluppatori che vogliono imparare le basi di questo linguaggio che è il fondamento per programmare nuove applicazioni per Mac Os X, iPhone ed iPad.
Riferimenti Associativi
Si usano i riferimenti associativi per simulare l'aggiunta di variabili di istanza di un oggetto ad una classe esistente.
I riferimenti associativi sono disponibili solo in Mac OS X v10.6 e successivi.
I riferimenti associativi sono disponibili solo in Mac OS X v10.6 e successivi.
Aggiungere Memoria fuori a una Definizione di Classe
Usando i riferimenti associativi, puoi aggiungere memoria ad un oggetto senza modificare la dichiarazione di classe. Questo può essere utile se non hai accesso al codice sorgente della classe, o se per motivi di compatibilità binaria non puoi alterare il layout dell'oggetto.
Le Associazioni sono basate su una chiave, quindi per ogni oggetto puoi aggiungere quante associazioni vuoi, ognuna usando una chiave diversa. Un'associazione può anche assicurare che l'oggetto associato rimane valido per almeno il tempo di vita dell'oggetto sorgente (senza la possibilità di introdurre cicli non riscuotibili in un ambiente garbage-collected).
Le Associazioni sono basate su una chiave, quindi per ogni oggetto puoi aggiungere quante associazioni vuoi, ognuna usando una chiave diversa. Un'associazione può anche assicurare che l'oggetto associato rimane valido per almeno il tempo di vita dell'oggetto sorgente (senza la possibilità di introdurre cicli non riscuotibili in un ambiente garbage-collected).
Creare Associazioni
Usate la funzione Objective-C di runtime objc_setAssociatedObject per creare un'associazione tra un oggetto ed un altro. La funzione prende quattro argomenti: l'oggetto sorgente, una chiave, il valore e una politica di associazione costante. Di queste, la chiave e la politica di associazione meritano ulteriori discussioni.
Listato 7-1 Stabilire un'associazione tra un array e una stringa
- La chiave è un puntatore a void. La chiave per ogni associazione deve essere unica. Un pattern tipico è usare una variabile statica.
- La politica specifica se l'oggetto associato è assegnato, conservato o copiato (assign, retain, copy) e se l'associazione è fatta atomicamente o non-atomicamente. Questo segue un pattern simile agli attributi di una proprietà dichiarata. Specifica la politica per la relazione usando una costante (vedi objc_AssociationPolicy).
Listato 7-1 Stabilire un'associazione tra un array e una stringa
static char overviewKey;
NSArray *array = [[NSArray alloc] initWithObjects:@"One", @"Two", @"Three", nil];
// For the purposes of illustration, use initWithFormat: to ensure the string can be deallocated
NSString *overview = [[NSString alloc] initWithFormat:@"%@", @"First three numbers"];
objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);
[overview release];
// (1) overview valid
[array release];
// (2) overview invalid
NSArray *array = [[NSArray alloc] initWithObjects:@"One", @"Two", @"Three", nil];
// For the purposes of illustration, use initWithFormat: to ensure the string can be deallocated
NSString *overview = [[NSString alloc] initWithFormat:@"%@", @"First three numbers"];
objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);
[overview release];
// (1) overview valid
[array release];
// (2) overview invalid
Al punto (1), la stringa overview è ancora valida poiché la politica OBJC_ASSOCIATION_RETAIN specifica che l'array conserva l'oggetto associato. Quando l'array è deallocato, (al punto 2), overview è rilasciata e in questo caso quindi, anche deallocata. Se provi, ad esempio, ad annotare il valore di overview, genererai un'eccezione di runtime.
Recuperare Oggetti Associati
Puoi recuperare un oggetto associato usando la funzione di runtime di Objective-C objc_getAssociatedObject. Continuando l'esempio mostrato nel listato 7-1, puoi recuperare overview dall'array usando la seguente linea di codice:
NSString *associatedObject = (NSString *)objc_getAssociatedObject(array, &overviewKey);
Rompere Associazioni
Per rompere un'associazione, si usa tipicamente objc_setAssociatedObject, passandogli nil come valore. Continuando l'esempio mostrato nel listato 7-1, potresti rompere l'associazione tra array e stringa overview usando la seguente linea di codice:
objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);
(Dato che l'oggetto associato è stato impostato a nil, la politica non è attualmente importante). Per rompere tutte le associazioni di un oggetto, puoi usare objc_removeAssociatedObjects. In generale, è sconsigliato usare questo dato che rompe tutte le associazioni per tutti i clienti. Usa questa funzione solo se hai bisogno di restaurare un oggetto a condizioni incontaminate.
Esempio Completo
Il seguente programma combina gli esempi di codice delle sezioni precedenti.
#import
#import
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
static char overviewKey;
NSArray *array = [[NSArray alloc] initWithObjects:@"One", @"Two", @"Three", nil];
// For the purposes of illustration, use initWithFormat: to ensure we get a // deallocatable string
NSString *overview = [[NSString alloc] initWithFormat:@"%@", @"First three numbers"];
objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);
[overview release];
NSString *associatedObject = (NSString *)objc_getAssociatedObject(array, &overviewKey);
NSLog(@"associatedObject: %@", associatedObject);
objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);
[array release];
[pool drain];
return 0;
}
#import
int main (int argc, const char * argv[]) {
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
static char overviewKey;
NSArray *array = [[NSArray alloc] initWithObjects:@"One", @"Two", @"Three", nil];
// For the purposes of illustration, use initWithFormat: to ensure we get a // deallocatable string
NSString *overview = [[NSString alloc] initWithFormat:@"%@", @"First three numbers"];
objc_setAssociatedObject(array, &overviewKey, overview, OBJC_ASSOCIATION_RETAIN);
[overview release];
NSString *associatedObject = (NSString *)objc_getAssociatedObject(array, &overviewKey);
NSLog(@"associatedObject: %@", associatedObject);
objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);
[array release];
[pool drain];
return 0;
}
Fine Ottava parte
Finisce qui l'ottavo articolo di questa Guida dedicato ai Riferimenti Associativi del linguaggio di programmazione Objective-C. Spero col tempo di realizzare un'utile manuale disponibile a tutti. Il prossimo post di questa guida, tratterà l'Enumerazione Veloce, un utile strumento che fornisce una sintassi concisa, efficiente e sicura, per enumerare i contenuti di una collezione. Segnalatemi eventuali errori, o commentate l'articolo se l'avete trovato utile, anche per incentivarmi a continuare a pubblicare le mie traduzioni. Iscrivetevi ai feed del blog per essere sempre aggiornati automaticamente ogni volta che sono disponibili nuovi contenuti. Nella barra laterale del blog potete trovare l'elenco di tutti gli articoli di questa guida.
Nessun commento:
Posta un commento