IPhone - NSKEYEDUNARCHIVER Memory
-
21-09-2019 - |
Pergunta
estou usando NSKeyedUnarchiver unarchiveObjectWithFile:
para ler nos dados do aplicativo. Ao correr com vazamentos em instrumentos, me disseram que o seguinte produz um vazamento:
{
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];
}
}
A linha:
applicationConfig = [NSKeyedUnarchiver unarchiveObjectWithFile:archivePath];
está produzindo um vazamento de memória de 32 bytes. ApplicationConfig é uma variável de instância. Minha função initWithCode simplesmente faz:
- (id)initWithCoder:(NSCoder *)coder {
if( self = [super init] )
{
//NSMutableArray
accounts = [[coder decodeObjectForKey:@"Accounts"] retain];
//Int
activeAccount = [coder decodeIntForKey:@"ActiveAccount"];
}
return self;
}
Qualquer ideia de por que
applicationConfig = [NSKeyedUnarchiver unarchiveObjectWithFile:archivePath];
está produzindo um vazamento?
Solução
Meu palpite é que seu vazamento de memória é causado por esta linha:
[applicationConfig retain];
ou esta linha:
accounts = [[coder decodeObjectForKey:@"Accounts"] retain];
A memória está sendo alocado dentro unarchiveObjectWithFile:
, mas o vazamento será causado por uma retenção extra no objeto. Certifique -se de estar lançando applicationConfig
adequadamente.