for(NSString *collectionName in jsonObjects)
{
NSDictionary *collection = [[NSDictionary alloc] init]; // Allocation
collection = [jsonObjects valueForKey:collectionName]; // overwriting above, LEAKS
NSArray *items = [[NSArray alloc] initWithArray:[collection valueForKey:@"items"]]; // Allocation
NSNumber *lastAccess = [[NSNumber alloc] init]; // Allocation
lastAccess = [collection valueForKey:@"lastAccess"]; // overwriting above, LEAKs
[items release];
}
appels qui ne contiennent pas « alloc » ou « nouveau » retour des références à l'objet qui sont « autoreleased » ce qui signifie qu'ils ne sont pas la propriété de vous, de les libérer provoqueront un accident. Vous pouvez les utiliser, mais seulement dans le cadre de la fonction que vous êtes, si vous en avez besoin pour une utilisation ultérieure, vous devrez appeler retain
sur eux. Ainsi, lorsque vous appelez des fonctions d'accesseur, vous n'avez qu'à déclarer les variables dont vous avez besoin et à ne pas créer de nouveaux objets.
alloc
crée un nouvel objet, dans le cas de collection
vous créez un NSDictionary
vide, mais vous écraser rapidement la référence à ce nouvel objet avec la référence autoreleased que vous obtenez de valueForKey:
cela va créer une fuite. Comme l'objet créé à l'origine ne sera pas libéré.
probablement devrait ressembler à ceci
for(NSString *collectionName in jsonObjects)
{
NSDictionary *collection = [jsonObjects valueForKey:collectionName];
NSArray *items = [collection valueForKey:@"items"];
NSNumber *lastAccess = [collection valueForKey:@"lastAccess"];
}
je me rends compte que, avec la capacité d'avoir des questions comme celle-ci a répondu par une foule prête à lire les manuels est devenu juste une corvée, mais si vous voulez vous progressez devrait avoir un Regardez, la plupart de la documentation Apple est exceptionnellement bien écrite que ces choses vont. Le memory management guide résoudra beaucoup de questions.
Merci Harald, j'ai regardé le guide de gestion de la mémoire, mais mal compris je suppose :(I comprenez bien ce que vous dites à propos de l'écrasement de mon initial alloc/init, mais j'ai une question concernant la différence fonctionnelle entre NSDictionary * collection = [jsonObjects valueForKey: collectionName] et NSDictionary * collection = [NSDictionary dictionaryWithDictionary: [jsonObjects valueForKey : collectionName]]; ie ces deux déclarations sont-elles fonctionnellement équivalentes, la documentation ne le précise pas? – Beliskna
Oui et non, les mêmes sont que les deux appels ne renvoient pas une référence à quelque chose que vous possédez (aucun d'entre eux ne contient 'alloc' ou 'new' ou 'copy', mais le premier crée un nouveau dictionnaire d l'initialise avec la valeur du dictionnaire donné (il s'appelle un 'constructeur de commodité'), le second renvoie juste le dictionnaire correspondant. [NSDictionary dictionaryWithDictionary: ...] est _different_ que [[NSDictionary alloc] initWithDictionary: ...] la seconde _does_ crée un objet que vous possédez –
Merci Harald, vous avez été très utile. – Beliskna