NSArray girando a caso in cose diverse!
Domanda
Sto avendo un problema con la gestione della memoria che penso. Il mio NSArray (chiamato arr) si sta trasformando in cose diverse, a volte casuali. Non ho idea del perché. Ho un file .h che che dichiara l'array, e poi ho inizializzare l'array usando
NSString *input = [[NSString alloc] initWithData:myData encoding:NSACIIStringEncoding];
arr = [input componentsSeperatedByString:@"\n"];
e poi lo uso per tutto il programma e improvvisamente si trasforma in cose diverse (UITouch, a volte, per esempio). Non ho mai chiamato un rilascio su di esso. Perché si fa questo? Come faccio a impedire che gli oggetti in modo casuale venga modificata a causa di problemi di memoria?
Grazie!
Soluzione
Cercate di mantenere il arr .
arr = [[input componentsSeperatedByString:@"\n"] retain];
Altri suggerimenti
Che cosa succede, è che la memoria, un tempo occupato dal vostro NSArray, è occupato da un altro oggetto. Questo può essere qualsiasi oggetto, e dal momento che si sta toccando lo schermo un sacco un UITouch è molto comune.
Questo significa che non stai conservando il NSArray quando si dovrebbe, in modo che venga rilasciato prematuramente. Non si mostra il dichiarando arr
codice, ma se si dichiara arr come
@property (nonatomic,retain) NSArray *arr;
e sintetizzare usando
@synthesize arr;
quindi il mantenimento viene gestito semplicemente assiging a self.arr
invece di arr
:
self.arr = [input componentsSeperatedByString:@"\n"];
Nel cacao parlare, vostro oggetto ora "possiede" l'array. Nel metodo dealloc
di questa classe, si dovrebbe [self.arr release]
.
In caso di assegnare qualche altro array self.arr
, l'oggetto assegnato a self.arr
precedenza otterrà rilasciato, e la nuova trattenuta.
o inizializzare un nuovo array con questa matrice:
arr = [[NSArray alloc] initWithArray:input];