即使我明确释放内存,也不会释放内存

时间:2012-02-26 13:25:28

标签: ios memory-management

我正在优化我的应用并确保正确实施内存管理。当我发现didUnload / dealloc / willAppear不能实现我的内存清理时,我决定实现自己的方法,这样我就可以完全控制这个内存管理。

头文件中我的数组的定义

@property (retain) NSMutableArray *selectedCardIDs;
@property (retain) NSMutableArray *selectedRowArray;
@property (retain) NSMutableArray *cardArray;
@property (retain) NSMutableArray *cardIDArray;

这里是发布方法:

- (void) willReleaseObjects {
[self.aCopyOfCardIDArray release];
[self.listOfItems release];
[self.aCopyListOfItems release];
[self.selectedCardIDs release];
[self.selectedRowArray release];
[self.cardArray release];
[self.cardIDArray release];

}

数组可能变得非常大(每个数据大于1000个),为什么在卸载视图后必须释放这些数组。我在IBAction方法中显式调用了这个函数,例如:

- (IBAction) stopDictionary:(UIBarButtonItem *) sender {
[self closeDatabase];
[self willReleaseObjects];
[self dismissModalViewControllerAnimated:YES];

}

我调试了代码,它实际上正在执行每个版本,但是当我用Instruments诊断内存分配时,它似乎只释放了部分内存,实际上几乎没有什么为什么每次加载时内存消耗当然都在增加再看一遍,这根本不好。 任何想法,为什么我的记忆没有在这里发布?感谢。

1 个答案:

答案 0 :(得分:1)

不要在属性上调用release,因为如果您将任何属性声明为assign或copy,则可能会发生非常糟糕的事情。您可能会释放已经自动释放的返回实例。

相反,要么释放它后面的实例变量,要么将属性设置为nil。无论哪种方式,您都将获得正确的结果。如果您的属性上有任何键/值观察器,最好的方法是将属性设置为nil,这将自动将值传播给任何观察者:

- (void) willReleaseObjects {
  self.aCopyOfCardIDArray = nil;
  self.listOfItems = nil;
  ...
}