La fonction que je suis à la recherche:Affectation des valeurs aux variables d'instance dans l'objectif C
-(void)viewDidLoad {
NSBundle *bundle = [NSBundle mainBundle];
NSString *plistPath = [bundle pathForResource:@"statedictionary" ofType:@"plist"];
NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
self.statesZips = dictionary;
[dictionary release];
NSArray *components = [self.stateZips allKeys];
NSArray *sorted = [components sortedArrayUsingSelector:@selector(compare:)];
self.States = sorted;
NSString *selectedState = [self.states objectAtIndex:0];
NSArray *array = [stateZips objectForKey: selectedState];
self.zips = array;
}
Pourquoi un NSDictionary alloué, puis affecté à un pointeur appelé * dictionnaire, puis affecté à la stateZips variable d'instance? Pourquoi ne pas l'allouer et l'affecter directement à la variable d'instance et économiser la mémoire de créer et libérer un autre NSDictionary? La même méthodologie est toujours suivie, y compris plus tard dans cette fonction avec le NSArray ...
NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
self.statesZips = dictionary;
[dictionary release];
En outre, ce tri met les clés d'une table de hachage (dictionnaire) dans l'ordre alphabétique. Je ne suis pas sûr que je comprends cette ligne:
NSArray *sorted = [components sortedArrayUsingSelector:@selector(compare:)];
Je pense réellement que la sémantique retain/assign de la propriété statesZips Le code alloue un objet et doit donc le libérer, * indépendamment * de la sémantique de statesZips, à moins qu'elle ne soit exécutée dans un environnement récupéré par la corbeille. –
@Barry Wark: bien, non. la sémantique des statesZips est très pertinente. si cette méthode ne conservait pas le dictionnaire ou ne le copiait pas, l'accès à statesZip après la ligne 7 entraînerait un comportement indéfini (probablement un segfault). – hop
Les fonctions de commodité telles que initWithContentsOfFile sont libérées automatiquement. –