2009-09-03 3 views
1

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]; 

또는이 행 :

답변

2

내 생각 엔 당신의 메모리 누수가이 선에 의해 발생한다는 것입니다

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

이 메모리는 unarchiveObjectWithFile:을 할당되고 있지만, 누출이 될 것입니다 객체에 여분의 보유로 인해 발생합니다. applicationConfig을 적절하게 출시해야합니다.

+0

내가 직접 할당하지 않았으므로 반환되는 객체를 유지해야한다는 것을 알았습니다. 이것에 대해 어떤 생각을 밝힐 수 있습니까? – Brian

+1

예, 보유해야합니다. 당신이 그것을 보유했기 때문에, 당신은 또한 그것을 어딘가에 놓아야합니다. 메모리 누출은 릴리스가 없어서 발생합니다. –

+0

응용 프로그램 대리인 (이 코드가 모두있는 곳)의 dealloc 메서드에서 applicationConfig를 릴리스합니다. 그래서 나는 아직도보고 된 누출을 이해하지 못한다. 동일한 방법으로 일치하는 릴리스가 표시되지 않기 때문에 누수가 있다고 생각할 수 있습니까? 당신의 도움을 주셔서 감사합니다. – Brian