venerdì 30 aprile 2010

Guida Objective-C in Italiano - Parte 8 - Riferimenti Associativi


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.




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.

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).

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.
  • 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).
Il seguente esempio mostra come puoi stabilire un'associazione tra un array ed una stringa.
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

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

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

Related Posts with Thumbnails