2009-09-03 4 views
1

Я использую 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];

производит утечку?

ответ

2

Я думаю, что ваша утечка памяти вызвана этой линии:

[applicationConfig retain]; 

или строки:

accounts = [[coder decodeObjectForKey:@"Accounts"] retain]; 

Память будучи выделяется в unarchiveObjectWithFile:, но утечка будет вызванное дополнительным удержанием на объекте. Убедитесь, что вы правильно освобождаете applicationConfig.

+0

Я думал, что прочитал, что мне нужно сохранить объект, который возвращается, так как я сам его не выделял. Можете ли вы пролить свет на это? – Brian

+1

Да, вам нужно сохранить его. Поскольку вы сохранили его, вы также должны его выпустить. Утечка памяти будет вызвана отсутствием выпуска. –

+0

Я освобождаю applicationConfig в методе dealloc делегата приложения (где находится весь этот код). Поэтому я до сих пор не понимаю сообщенную утечку. Возможно ли, что он считает, что будет утечка, поскольку он не видит соответствующий выпуск в том же методе? Спасибо за вашу помощь. – Brian

Смежные вопросы