Allocation ivar dans un initWithNibName
Adau
Membre
Coucou !
J'ai un code qui marche très bien, et qui à priori ne provoque aucune fuite mémoire. Mais je vous explique:
J'ai une classe qui dérive de UITableViewController qui possède, pour des raisons de performances, une ivar NSArray (le contenu du tableau à afficher).
Lors de l'initialisation de cette classe, il faut bien allouer un espace pour ce NSArray. Je le fais dans le initWithNibName puisque ce controlleur est appelé par cette fonction.
Je désalloue ce NSArray dans la commande dealloc de la classe.
Dans Instruments, il ne semble y avoir aucune fuite, mais avec une analyse de Clang, il me dit que l'objet n'est pas désalloué.
Il semblerait que mon code ne soit pas "légal".
Clang me dit, par contre, que mon bmArray est un "leaked object", alors que j'ai bien ceci :
Evidemment, j'ai essayé de faire un [NSArray arrayWithArray] mais le reste du programme plante, vu que le NSArray n'a pas de mémoire alloué.
Vous feriez quoi vous, pour alloué un ivar sans avoir d'erreur de la part de Clang ?
PS: J'ai pensé à retirer l'ivar et aller chercher les informations dans la methode cellForRowAtIndexPath: mais c'est idiot vue qu'on accède N fois au fichier. J'ai pas vraiment fait de tests, mais ça fait sale, mais si ça marcherai.
Adrien
J'ai un code qui marche très bien, et qui à priori ne provoque aucune fuite mémoire. Mais je vous explique:
J'ai une classe qui dérive de UITableViewController qui possède, pour des raisons de performances, une ivar NSArray (le contenu du tableau à afficher).
Lors de l'initialisation de cette classe, il faut bien allouer un espace pour ce NSArray. Je le fais dans le initWithNibName puisque ce controlleur est appelé par cette fonction.
Je désalloue ce NSArray dans la commande dealloc de la classe.
Dans Instruments, il ne semble y avoir aucune fuite, mais avec une analyse de Clang, il me dit que l'objet n'est pas désalloué.
Il semblerait que mon code ne soit pas "légal".
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {<br /> if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) {<br /> [self setTitle:@"Bonus Malus"];<br /> [[self view] setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"fond.jpg"]]];<br /> <br /> NSString *path = [[NSBundle mainBundle] pathForResource:@"bm" ofType:@"plist"];<br /> NSData *bmData = [NSData dataWithContentsOfFile:path];<br /> [self setBmArray:[[NSArray alloc] initWithArray:[NSPropertyListSerialization propertyListFromData:bmData mutabilityOption:NSPropertyListImmutable format:nil errorDescription:nil]]];<br /> }<br /> return self;<br />}
Clang me dit, par contre, que mon bmArray est un "leaked object", alors que j'ai bien ceci :
- (void)dealloc {<br /> [bmArray dealloc];<br /> [super dealloc];<br />}
Evidemment, j'ai essayé de faire un [NSArray arrayWithArray] mais le reste du programme plante, vu que le NSArray n'a pas de mémoire alloué.
Vous feriez quoi vous, pour alloué un ivar sans avoir d'erreur de la part de Clang ?
PS: J'ai pensé à retirer l'ivar et aller chercher les informations dans la methode cellForRowAtIndexPath: mais c'est idiot vue qu'on accède N fois au fichier. J'ai pas vraiment fait de tests, mais ça fait sale, mais si ça marcherai.
Adrien
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
[bmArray release];
Le mieux serait que tu fasse un setter avec retain et que dans ton init tu passe par un pointeur intermédiaire que tu alloc/init, enssuite tu l'assigne via le setter et ensuite tu release le pointeur temporaire
Si je fais ceci, je plante tout mon programme.
Yoann m'a soufflé LA bonne idée. Mon setter était en (assign, nonatomic).
J'avais déjà essayer de passer par un pointeur intermédiaire, mais si le setter est en assign, c'est sur que c'était inutile...
Merci encore à vous pour vos réponses pertinentes.
Adrien
Ton dealloc doit être comme ça :
ou encore
pour libérer ta mémoire