Cocoa NSMutableArray initWithContentsOfFile内存泄漏

Cocoa NSMutableArray initWithContentsOfFile内存泄漏,cocoa,memory,nsmutablearray,memory-leaks,Cocoa,Memory,Nsmutablearray,Memory Leaks,我是iPhone开发的新手,我有内存泄漏 我正在使用NSMutableArray检索位于Documents目录中的.plist文件的内容 我第一次使用它时,一切都很顺利,但如果我多次调用它,就会出现内存泄漏 这是我的代码: - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; NSArray *paths = NSSearchPathForDirectoriesInDomains

我是iPhone开发的新手,我有内存泄漏

我正在使用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];
我不知道如何解决这个漏洞,如果有人能分享任何解决方案,我会非常感激


提前谢谢。

财产的申报情况如何

如果声明是:

@property(retain) id composedArray;
这就是内存泄漏的地方。复制会增加引用计数,保留也会增加引用计数。如果您在任何时候分配给ComposeArray,您将通过读取代码来分配副本,您应该将您的属性声明为:

@property(copy) id composedArray;
然后将代码更改为:

self.composedArray = savedArray;

复制将发生在合成访问器中。

我将代码更改为您的代码,但似乎没有任何变化,我认为真正的问题是每次视图出现时我都会重用NSMutableArray,而这根本不是发布。我将这些代码行移动到我的viewdidLoad中,一切都很完美,这是因为我没有重用NSMutableArray,但我需要重用它,我该怎么做呢?Jonathan:如果你想保留可变数组,直接将其分配给实例变量,不要复制它并分配它。您问题中的代码创建了一个副本,副本就是副本所做的,它将副本存储在实例变量中,并将原始副本放在地板上,从而导致泄漏。您应该重新阅读内存管理规则: