NSKeyedUnarchiver unarchiveObjectWithFile:
을 사용하여 애플리케이션 데이터를 읽습니다. 악기의 누출 실행하면, 다음과 같은이 누출을 생산하고 있다고 말했다 오전 :아이폰 - 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];
가 누출을 생산의 어떤 생각을?
[applicationConfig retain];
또는이 행 :
내가 직접 할당하지 않았으므로 반환되는 객체를 유지해야한다는 것을 알았습니다. 이것에 대해 어떤 생각을 밝힐 수 있습니까? – Brian
예, 보유해야합니다. 당신이 그것을 보유했기 때문에, 당신은 또한 그것을 어딘가에 놓아야합니다. 메모리 누출은 릴리스가 없어서 발생합니다. –
응용 프로그램 대리인 (이 코드가 모두있는 곳)의 dealloc 메서드에서 applicationConfig를 릴리스합니다. 그래서 나는 아직도보고 된 누출을 이해하지 못한다. 동일한 방법으로 일치하는 릴리스가 표시되지 않기 때문에 누수가 있다고 생각할 수 있습니까? 당신의 도움을 주셔서 감사합니다. – Brian