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非常感謝。
在此先感謝。
我把我的代碼更改爲你的,但似乎沒有改變,我認爲真正的問題是我重用NSMutableArray每次出現視圖,而這根本不是釋放。 – Jonathan 2010-01-18 22:45:58
我將這些代碼行移動到我的viewdidLoad中,並且一切都很完美,那是因爲我沒有重用NSMutableArray,但我需要重用它,我該怎麼做? – Jonathan 2010-01-18 22:51:53
Jonathan:如果你想要堅持可變數組,請將其直接分配給實例變量 - 不要複製它並分配它。你的問題中的代碼會生成一個副本(這就是'copy'的作用),將副本存儲在實例變量中,並將原始代碼放在地板上 - 因此泄漏。您應該重新閱讀內存管理規則:http://developer.apple.com/mac/library/documentation/General/Conceptual/DevPedia-CocoaCore/MemoryManagement.html – 2010-01-19 04:48:53