2009-09-03 138 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

我在應用程序委託的dealloc方法(所有這些代碼所在的位置)中釋放applicationConfig。所以我仍然不明白報道的泄漏。它可能會認爲會有泄漏,因爲它沒有在同一個方法中看到匹配的版本?謝謝你的幫助。 – Brian