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)
È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top