Я давно смотрю на эту же проблему и буду очень признателен за любую помощь или предложения. Я уверен, что это что-то простое, но я не могу найти это. В моем делегате приложения я загружаю кучу вспомогательных объектов (созданный мной объект, который поддерживает NSCopying) со следующим кодом:
NSString *path = [[NSBundle mainBundle] pathForResource:@"Accessories" ofType:@"plist"];
NSDictionary *accDict = [[NSDictionary alloc] initWithContentsOfFile:path];
self.colors = (NSArray *) [accDict objectForKey:@"Colors"];
self.exteriorAccessories = [self loadAccessoriesForMode:EXTERIOR_MODE withDictionary:accDict];
self.interiorAccessories = [self loadAccessoriesForMode:INTERIOR_MODE withDictionary:accDict];
[accDict release];
И вот определение метода, вызывающего его:
-(NSArray *)loadAccessoriesForMode:(NSString *)mode withDictionary:(NSDictionary *) dictionary
{
NSMutableArray *tempValues = [[NSMutableArray alloc] init];
for (NSDictionary *value in [dictionary objectForKey:mode])
{
Accessory *accessory = [[Accessory alloc] initWithDictionary:value];
[tempValues addObject:accessory];
[accessory release];
}
NSArray *returnArray = [[NSArray alloc] initWithArray:tempValues copyItems:YES];
[tempValues release];
[returnArray autorelease];
return returnArray;
}
Когда я попадаю в релиз для accDict, я получаю исключение EXC_BAD_ACCESS
. Если я вынимаю освобождение аксессуара внутри цикла, все в порядке - но я пропускаю объекты Аксессуара (что мне кажется очевидным - если я его инициирую и выделяю, это моя работа, чтобы освободить его).
Когда я прохожу через это в отладчике, я вижу, что методы init, copy и dealloc все запускаются на моем объекте Accessory, как и ожидалось. Я также могу опубликовать код для объекта Accessory, если вы думаете, что это поможет, но я думаю, что проблема где-то в этом коде.