По какой-то причине, когда я выпускаю NSArray, я получаю исключение EXC_BAD_ACCESS. Вот реализация:Управление памятью NSArray
-(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;
}
UPDATE 1:
Итак, проблема заключалась в том, что, хотя я был ответственен за освобождение объекта imagesPath, поскольку я использовал Alloc, что скоро станет неуместным, когда pathsForResourcesOfType возвратил объект автоопределения. Это означает, что я не должен освобождать объект imagesPath вручную.
В следующей строке следует использовать:
NSArray *imagesPath = [bundle pathsForResourcesOfType:@"png" inDirectory:@"Images"];
UPDATE 2:
Другой вопрос, который связан с этой должности. В следующем коде я инициализирую новый NSMutableArray вручную.
alphabets = [[NSMutableArray alloc] init];
Позже я вставляю CCSprite (объекты Cocos2d) в массив алфавитов. CCSprite являются объектами автореферата. Должен ли я все же выпускать алфавиты вручную? Так как через какое-то время все объекты будут выпущены, и память будет возвращена, но тогда что останется в алфавитах NSMutable массива?
Утечка происходит, когда вы переназначаете imagesPath на путиForResourcesOfType: call, потому что вы уже выделили и я –