Я использую NSKeyedUnarchiver unarchiveObjectWithFile:
для чтения в данных приложения. При работе с утечками в инструментах, я сказал, что следующий производит утечку:IPhone - Ошибка памяти NSKeyedUnarchiver
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *archivePath = [[NSString alloc]initWithFormat:@"%@/Config.archive", documentsDirectory];
//Following line produces memory leak
applicationConfig = [NSKeyedUnarchiver unarchiveObjectWithFile:archivePath];
[archivePath release];
if(applicationConfig == nil)
{
applicationConfig = [[Config alloc]init];
}
else
{
[applicationConfig retain];
}
}
Линии:
applicationConfig = [NSKeyedUnarchiver unarchiveObjectWithFile:archivePath];
производит утечку памяти 32 байт. applicationConfig - это переменная экземпляра. Моя функция initWithCode просто делает:
- (id)initWithCoder:(NSCoder *)coder {
if(self = [super init])
{
//NSMutableArray
accounts = [[coder decodeObjectForKey:@"Accounts"] retain];
//Int
activeAccount = [coder decodeIntForKey:@"ActiveAccount"];
}
return self;
}
Любая идея, почему
applicationConfig = [NSKeyedUnarchiver unarchiveObjectWithFile:archivePath];
производит утечку?
Я думал, что прочитал, что мне нужно сохранить объект, который возвращается, так как я сам его не выделял. Можете ли вы пролить свет на это? – Brian
Да, вам нужно сохранить его. Поскольку вы сохранили его, вы также должны его выпустить. Утечка памяти будет вызвана отсутствием выпуска. –
Я освобождаю applicationConfig в методе dealloc делегата приложения (где находится весь этот код). Поэтому я до сих пор не понимаю сообщенную утечку. Возможно ли, что он считает, что будет утечка, поскольку он не видит соответствующий выпуск в том же методе? Спасибо за вашу помощь. – Brian