Dire che ho una classe tableview che elenca 100 oggetti Foo. Ha:Va bene se più oggetti mantengono lo stesso oggetto in Objective-C/Cocoa?
@property (nonatomic, retain) NSMutableArray* fooList;
e riempire con Foos come:
self.fooList = [NSMutableArray array]; while (something) { Foo* foo = [[Foo alloc] init]; [fooList addObject:foo]; [foo release]; }
Prima domanda: perché il NSMutableArray è contrassegnato come trattenere, ciò significa tutti gli oggetti al suo interno vengono mantenuti troppo? Sto aggiungendo correttamente il foo e rilasciando la copia locale dopo che è stata aggiunta all'array? O mi manca una chiamata di mantenimento?
Poi, se l'utente seleziona una riga specifica nella tabella e voglio visualizzare un dettaglio vista Foo io chiamo:
FooView* localView = [[FooView alloc] initWithFoo:[self.fooList objectAtIndex:indexPath.row]]; [self.navigationController pushViewController:localView animated:YES]; [localView release];
Ora la classe FooView ha:
@property (nonatomic, retain) Foo* theFoo;
così ora entrambi la matrice è aggrappata a quel Foo e al FooView. Ma sembra ok? Quando l'utente preme il pulsante indietro dealloc verrà chiamato su FooView e verrà chiamato [theFoo release]. Quindi viene colpito un altro pulsante indietro e dealloc viene chiamato sulla classe tableview e viene chiamato [fooList release].
Si potrebbe obiettare che la classe FooView dovrebbe avere:
@property (nonatomic, assign) Foo* theFoo;
vs. trattenere. Ma a volte la classe FooView viene chiamata con un Foo che non è anche in un array. Quindi volevo assicurarmi che fosse giusto avere due oggetti che si aggrappavano allo stesso altro oggetto.
Typo: "... e rilasciano i relativi oggetti di contenuto quando viene rilasciato l'oggetto di raccolta." Gli oggetti nelle raccolte non vengono rilasciati fino a quando la raccolta non viene * deallocata *. – JeremyP
Grazie, risolto. Anche se si potrebbe sostenere che con "rilasciato" intendevo "l'ultima versione, in base alla quale il conteggio dei ritiri va a zero e ciò fa scattare dealloc": P, ma solo dicendo dealloc è più chiaro in quel contesto. – Jaanus