Objective C / iPhone: E 'possibile ri inizializzare un NSArray?
-
20-09-2019 - |
Domanda
Ho letto che i tipi di dati non mutabili non possono essere modificati una volta create. (Ad esempio NSString o NSArray).
Ma possono essere re-inizializzato per puntare a un diverso insieme di oggetti?
Se è così, posso usare il rilascio di liberare qualsiasi alloc dal primo turno di tempo tra usi? ad esempio:
myArray dichiarati NSArray * myArray nell'interfaccia, e come nonatomic / trattenere property.myArray set in codice di inizializzazione di un punto ad un array di stringhe come segue.
self.myArray = [myString componentsSeparatedByString:@","];
Ma più tardi voglio ri-inizializzare myArray per puntare a un diverso insieme di stringhe
self.myArray = [myOtherString componentsSeparatedByString:@","];
E 'possibile? Grazie ...
Soluzione
Sì, è possibile reinizializzata la NSArray. Ecco il codice di esempio che ho usato per reinizializzata la NSArray.
NSString *keywords = @"FirstName|LastName|Address|PhoneNumber";
NSArray *arr = [keywords componentsSeparatedByString:@"|"];
NSLog(@"First Init - %@,%@,%@,%@",[arr objectAtIndex:0],[arr objectAtIndex:1],
[arr objectAtIndex:2],[arr objectAtIndex:3]);
arr = nil;
keywords = @"First_Name|Last_Name|_Address|_PhoneNumber";
arr = [keywords componentsSeparatedByString:@"|"];
NSLog(@"Second Init - %@,%@,%@,%@",[arr objectAtIndex:0],[arr objectAtIndex:1],
[arr objectAtIndex:2],[arr objectAtIndex:3]);
Altri suggerimenti
Dipende cosa si intende con re-inizializzazione . È possibile assegnare altro oggetto immutabile a un puntatore, perché i puntatori non sono costanti.
Esempio:
@interface MyObj : NSObject {
NSString *name; // not needed in 64bit runtime AFAIK
}
@property(retain) NSString *name; // sane people use copy instead of retain
// whenever possible. Using retain can
// lead to some hard to find errors.
@end
/* ... another file ... */
MyObj *theObject = [[[MyObj alloc] init] autorelease];
theObject.name = @"Peter";
NSString *oldName = theObject.name;
NSLog(@"%@", theObject.name); // -> Peter
NSLog(@"%@", oldName); // -> Peter
theObject.name = @"Martin";
NSLog(@"%@", theObject.name) // -> Martin
NSLog(@"%@", oldName) // -> Peter
Se il comportamento di cui sopra è ciò che si vuole, va bene.
Se si desidera che l'ultima linea per tornare Martin che sei nei guai. Queste sono le stringhe costanti e sono non lo scopo di essere modificati . Si potrebbe, se si vuole veramente, modificare la memoria dell'oggetto direttamente, ma Questo è pericoloso e non raccomandato. Utilizzare oggetti mutabili se avete bisogno di un tale comportamento.
Certo che possono. Dicendo che un NSArray
è immutabile non significa che un attributo di una classe di questo tipo non può essere modificato. Non è possibile modificare il contenuto, ma è possibile assegnare nuovi contenuti ad esso.
Se si vuole fare cambiando anche il riferimento impossibile si dovrebbe usare const
parola chiave.