Pour une raison quelconque quand je relâche le NSArray je reçois l'exception EXC_BAD_ACCESS. Voici la mise en œuvre:NSArray gestion de la mémoire
-(void) loadAllAlphabets
{
NSBundle *bundle = [NSBundle mainBundle];
NSArray *imagesPath = [[NSArray alloc] init];
imagesPath = [bundle pathsForResourcesOfType:@"png" inDirectory:@"Images"];
alphabets = [[NSMutableArray alloc] init];
NSString *fileName = [[NSString alloc] init];
for(int i=0; i<= imagesPath.count -1 ; i++)
{
fileName = [[imagesPath objectAtIndex:i] lastPathComponent];
CCSprite *sprite = [CCSprite spriteWithFile:fileName];
sprite.userData = [[fileName stringByDeletingPathExtension] uppercaseString];
[alphabets addObject:sprite];
}
// release fileName
[fileName release];
fileName = nil;
[imagesPath release]; // this causes the application to crash with EXC_BAD_ACCESS
// imagesPath = nil;
}
MISE À JOUR 1:
Ainsi, le problème est que même si je déversait l'objet imagesPath depuis je alloc que bientôt devenir hors de propos quand pathsForResourcesOfType a renvoyé un objet autorelease. Cela signifie que je ne devrais pas libérer l'objet imagesPath manuellement.
La ligne suivante doit être utilisée:
NSArray *imagesPath = [bundle pathsForResourcesOfType:@"png" inDirectory:@"Images"];
MISE À JOUR 2:
Une autre question qui est liée à ce poste. Dans le code suivant, j'initialise un nouveau NSMutableArray manuellement.
alphabets = [[NSMutableArray alloc] init];
Plus tard, j'insérer CCSprite (objets) en cocos2d tableau alphabets. CCSprite sont des objets autorelease. Dois-je encore publier des alphabets manuellement? Puisque, après un certain temps, tous les objets sont libérés et la mémoire sera retournée, mais que restera-t-il dans le tableau NSMutable des alphabets?
La fuite se produit lorsque vous réaffectez imagesPath à l'appel pathsForResourcesOfType: parce que vous avez déjà alloué et –