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 ...

È stato utile?

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.

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