2010-01-18 61 views
2

我是新的iPhone開發,我有這種內存泄漏。NSMutableArray initWithContentsOfFile內存泄漏

我正在使用NSMutableArray來檢索位於Documents目錄中.plist文件的內容。

我第一次使用它,一切都很順利,但如果我多次調用它,我會發生內存泄漏。

這是我的代碼:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains 
         (NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    //make a file name to write the data to using the 
    //documents directory: 
    fullFileName = [NSString stringWithFormat:@"%@/SavedArray", documentsDirectory]; 
    //retrieve your array by using initWithContentsOfFile while passing 
    //the name of the file where you saved the array contents. 
    savedArray = nil; 
    savedArray = [[NSMutableArray alloc] initWithContentsOfFile:fullFileName]; 
    self.composedArray = [savedArray copy]; 
    [savedArray release]; 
    [self.tableView reloadData]; 
} 

我釋放每次視圖中消失

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [composedArray release]; 
    composedArray = nil; 
    [savedArray release]; 
} 

我使用的儀器,這讓我發現了內存泄漏源是這行代碼一次:

savedArray = [[NSMutableArray alloc] initWithContentsOfFile:fullFileName]; 

我不知道如何解決這個泄漏,如果任何人可以分享任何解決方案,我會rea非常感謝。

在此先感謝。

回答

5

財產composedArray的聲明如何?

如果聲明是:

@property(retain) id composedArray; 

這就是內存泄漏。 copy遞增引用計數,retain也是如此。如果任何時候你分配給composedArray你會分配一個副本(因爲它似乎通過閱讀你的代碼),你應該申報的財產爲:

@property(copy) id composedArray; 

,然後改變你的代碼,這樣做:

self.composedArray = savedArray; 

(複製將發生在合成訪問器中)。

+0

我把我的代碼更改爲你的,但似乎沒有改變,我認爲真正的問題是我重用NSMutableArray每次出現視圖,而這根本不是釋放。 – Jonathan 2010-01-18 22:45:58

+0

我將這些代碼行移動到我的viewdidLoad中,並且一切都很完美,那是因爲我沒有重用NSMutableArray,但我需要重用它,我該怎麼做? – Jonathan 2010-01-18 22:51:53

+0

Jonathan:如果你想要堅持可變數組,請將其直接分配給實例變量 - 不要複製它並分配它。你的問題中的代碼會生成一個副本(這就是'copy'的作用),將副本存儲在實例變量中,並將原始代碼放在地板上 - 因此泄漏。您應該重新閱讀內存管理規則:http://developer.apple.com/mac/library/documentation/General/Conceptual/DevPedia-CocoaCore/MemoryManagement.html – 2010-01-19 04:48:53