Question

Je lis que les types de données non mutables ne peuvent pas être modifiés une fois créés. (Par exemple NSString ou NSArray).

Mais peuvent-ils être réinitialisés pour pointer vers un autre ensemble d'objets?

Si oui, dois-je utiliser la libération pour libérer toute alloc du premier tour de temps entre les deux utilisations? par exemple:

monTableau déclarée comme NSArray * monTableau dans l'interface, et que nonatomic / retenir ensemble property.myArray dans le code d'initialisation à un point à un tableau de chaînes comme suit.

self.myArray = [myString componentsSeparatedByString:@","];

Mais plus tard, je veux re-initialiser monTableau pour pointer vers un autre ensemble de chaînes

self.myArray = [myOtherString componentsSeparatedByString:@","];

Est-il possible? Merci ...

Était-ce utile?

La solution

Oui, vous pouvez réinitialisée le NSArray. Voici l'exemple de code que je l'ai utilisé pour RÉINITIALISÉS le 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]);

Autres conseils

Cela dépend vraiment de ce que vous entendez par re-initialize . Vous pouvez attribuer une autre objet immuable à un pointeur, parce que les pointeurs ne sont pas constants.

Exemple:

@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

Si le comportement ci-dessus est ce que vous voulez, c'est très bien.

Si vous voulez que la dernière ligne pour revenir Martin vous êtes en difficulté. Ce sont des chaînes constantes et sont pas destiné à modifier . Vous pouvez, si vous voulez vraiment, modifier la mémoire de l'objet directement, mais c'est dangereux et non recommandé. Utilisez des objets mutables si vous avez besoin de tels comportements.

Bien sûr, ils peuvent. Dire qu'un NSArray est immuable ne signifie pas qu'un attribut d'une classe de ce type ne peut pas être changé. Vous ne pouvez pas modifier le contenu, mais vous pouvez attribuer un nouveau contenu à lui.

Si vous voulez faire changer également la référence impossible que vous utilisez mot-clé const.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top