2010-09-03 3 views
0

J'ai quelques difficultés à tenter de supprimer une fuite de mémoire de mon code. Dans le code ci-dessous, j'obtiens une fuite de mémoire sur la ligne "configurationArray = [[NSArray arrayWithContentsOfFile: controllerConfigurationFilePath] retain];" Cependant, lorsque j'enlève la retenue, l'application se bloque et la modification de la retenue à une autorelease provoque également un crash.Fuite de mémoire avec une matrice - objectif c

merci, William

-(NSArray*)decodeConfigurationFile:(NSString*)fileName{ 
NSArray* configurationArray = [[NSArray alloc] init]; 

NSString *controllerConfigurationFilePath = [[NSBundle mainBundle] pathForResource:fileName ofType:@"plist"]; 
if (controllerConfigurationFilePath != nil) { 
    // returns array of items storing the data for form 
    configurationArray = [[NSArray arrayWithContentsOfFile:controllerConfigurationFilePath] retain]; 
} 

// returns fields dictionary objects from plist into an array 
return [[configurationArray objectAtIndex:0] objectForKey:@"fields"]; 
} 

Répondre

2

Le problème semble être que vous allouons un tableau en faisant

NSArray* configurationArray = [[NSArray alloc] init]; 

puis vous créez un nouveau tableau en faisant

Sans jamais libérer le premier tableau que vous avez créé.

La première ligne doit être juste

NSArray* configurationArray = nil; 

Et vous ne devriez pas avoir besoin Retain, car il est une variable locale et vous n'êtes pas garder un pointeur sur ce tableau au-delà de la portée de cette fonction. L'incident provient probablement du fait que l'objet appelant cette méthode ne retient probablement pas l'objet renvoyé par cette méthode, qui sera désalloué avec le tableau si rien d'autre ne le retient. Ainsi, lorsque vous essayez d'accéder à cet objet ailleurs dans votre code, l'objet n'est plus là. Si l'objet appelant doit conserver cet objet retourné, l'objet appelant doit conserver l'objet renvoyé.

+0

Merci pour la réponse rapide. J'ai mis en place les changements décrits ci-dessus. Et fait en sorte que la variable ("champs") à laquelle le tableau retourné est assigné a un conserver. Cependant quelque part dans mon code cette variable est effacée et quand je tente de l'utiliser, elle plante. Je pense que cela peut avoir quelque chose à faire avec ne pas conserver ce "[NSArray arrayWithContentsOfFile: controllerConfigurationFilePath]" et puis essayer de l'utiliser avec cette déclaration: "[[fields objectAtIndex: index] objectForKey: @" costAtHour "]; – williamb

+0

Une enquête plus approfondie, m'a montré que je n'utilisais pas self.fields lors de l'accès à cette propriété et c'est ce qui a causé le crash. Merci – williamb

+0

il peut être utile de voir l'entrée .plist pour le dictionnaire 'fields' impliqué par l'appel. – falconcreek