Rilasciare il controller di visualizzazione che si trova nel dizionario nell'obiettivo c
-
19-09-2019 - |
Domanda
Ho un codice nel mio progetto come segue. Sto aggiungendo la vista dei controller di visualizzazione alla vista di ogni cella della tabella.
Un array, come questi
NSMutableArray *arrTbl=[[NSMutableArray alloc] init];
NSMutableDictionary *dOne=[[NSMutableDictionary alloc] init];
myViewController *objVCtr=[[myViewController alloc] initWithNibName:@"myViewController" bundle:nil];
[dOne setValue:objVCtr forKey:@"cellVCtr"];
NSMutableDictionary *dTwo=[[NSMutableDictionary alloc] init];
myViewController *objVCtr1=[[myViewController alloc] initWithNibName:@"myViewController" bundle:nil];
[dOne setValue:objVCtr1 forKey:@"cellVCtr"];
NSMutableDictionary *dThree=[[NSMutableDictionary alloc] init];
myViewController *objVCtr2=[[myViewController alloc] initWithNibName:@"myViewController" bundle:nil];
[dOne setValue:objVCtr2 forKey:@"cellVCtr"];
[arrTbl addObjectsFromArray:[NSArray arrayWithObjects:dOne,dTwo,dThree,nil]];
Ora, la domanda è: come rilasciare questo?
ARRTBL è l'array principale con dizionari e dizionari che hanno Ref of View Controller.
Quindi, dovrei scrivere le seguenti dichiarazioni dopo le dichiarazioni sopra?
[dOne release];
[dTwo release];
[dThree release];
[objVCtr release];
[objVCtr1 release];
[objVCtr2 release];
Dopo aver scritto il codice sopra, l'array può indicare i controller di visualizzazione o no?
Per riassumere, le domande sono:
- Cosa contiene effettivamente il dizionario? (È conservare il conteggio dei controller di visualizzazione o solo riferimento dei controller di visualizzazione)
- Cosa contiene effettivamente l'array? (Conserva il conteggio dei dizionari o solo il riferimento dei dizionari?)
- Qui voglio solo avere una serie di controller di visualizzazione e ogni controllore di visualizzazione con valori diversi (per questo sto aggiungendo un dizionario a un array)
Soluzione
Dizionari e array contengono puntatori agli oggetti, ma l'implementazione interna di queste classi non è importante. Ciò a cui hai bisogno per prestare attenzione è la proprietà degli oggetti.
Dai un'occhiata a http://boredzo.org/cocoa-intro/, in particolare la sezione di gestione della memoria che afferma:
- Se si crea un oggetto con un metodo il cui selettore contiene la parola "alloc" o "nuovo", o con una funzione il cui nome contiene la parola "crea", allora la possiedi.
- Se si crea una copia di un oggetto esistente usando un metodo il cui selettore contiene la parola "copia" o da una funzione il cui nome contiene la parola "copia" (o ottieni un oggetto da tale funzione), allora possiedi la copia.
- Altrimenti, non possiedi l'oggetto.
- Se possiedi un oggetto, sei obbligato a rilasciarlo.
Nel tuo caso stai creando gli oggetti utilizzando -alloc
, quindi possiedi gli oggetti e ne sei responsabile. Quindi, sì, devi rilasciarli dopo averli aggiunti all'array.
NSArray
e NSDictionary
Mantieni i loro membri, quindi una volta aggiunti un oggetto a un array o di un dizionario è possibile rilasciarlo in sicurezza, l'oggetto non verrà traffico fino a quando l'array stesso rimuove l'oggetto o viene traffico da solo.
Per renderlo più facile per te stesso, puoi usare i costruttori di convenienza che restituiscono oggetti autorelati:
//note the autorelease when the view controllers are created
MyViewController* viewController = [[[MyViewController alloc] initWithNibName:@"myViewController" bundle:nil] autorelease];
NSDictionary *dOne = [NSDictionary dictionaryWithObject:viewController forKey:@"cellVCtr"];
MyViewController *objVCtr1 = [[[MyViewController alloc] initWithNibName:@"myViewController" bundle:nil] autorelease];
NSDictionary* dTwo = [NSDictionary dictionaryWithObject:objVCtr1 forKey:@"cellVCtr"];
MyViewController *objVCtr2 = [[MyViewController alloc] initWithNibName:@"myViewController" bundle:nil];
NSDictionary* dThree = [NSDictionary dictionaryWithObject:objVCtr2 forKey:@"cellVCtr"];
NSArray* arrTbl = [NSArray arrayWithObjects:dOne, dTwo, dThree, nil];
//do something with arrTbl
//make sure you retain it if you want to hang on to it
Altri suggerimenti
Quando si aggiungono oggetti alle raccolte (come dizionari e array), la raccolta manterrà l'aggiunta dell'oggetto.
Se vuoi che l'oggetto vivi solo fintanto che è nella collezione, una buona abitudine è quella di rilasciare automaticamente un oggetto prima di aggiungerlo a una raccolta o rilasciare esplicitamente un oggetto subito dopo averlo aggiunto a una collezione, come così:
MyObject *anObject = [[[MyObject alloc] init] autorelease];
[aDictionary setObject:anObject forKey:@"aKey"];
o
MyObject *anObject = [[MyObject alloc] init];
[aDictionary setObject:anObject forKey:@"aKey"];
[anObject release];
Ricorda che quando un oggetto viene rimosso dalla raccolta, la raccolta lo rilascerà.
Ciò significa che se la raccolta è l'unico fermo dell'oggetto, l'oggetto verrà trattato dopo essere stato rimosso dalla raccolta.