我继承了一些代码,它看起来像这样:
- (bool)makeOneLevel:(int)nummines objects:(int)numobjects
{
[field release];
state = gameWait;
field = [[MineField alloc] createLevel:nummines objects:numobjects];
if([field rating] == -1)
{
return false;
}
...
总是分配一个MineField。每当你创建一个新字段时,该函数所做的第一件事就是释放旧字段。如果函数成功生成MineField,则返回true。
我也有:
while(numsaved < self.makeNumber)
{
while(![mineView makeOneLevel:self.makeNumMines objects:self.makeNumObjects])
{
}
{
//saving code here
}
numsaved++;
}
在创建有效的MineField之前调用该函数。这一切都有效。但它在执行此操作时会分配GB的RAM。但Leaks工具没有发现泄漏,当外部完成并且操作系统获得控制权时,所有RAM都被解除分配。
我在MineField分配上做错了什么,或者我应该在创建过程中寻找其他地方?
答案 0 :(得分:6)
在不知道内部结构的情况下,不可能肯定地说,但是您所描述的行为听起来像-[MineView makeOneLevel:objects:]
是在内部分配和自动释放对象。由于AppKit默认事件循环为它处理的每个事件创建并清理自动释放池,所以一切最终都会消失,但直到事件处理完毕(例如,在您的方法退出后)。
最简单的解决方案是在while()
循环周围包装您自己的自动释放池,并在每次循环或定期消耗它。但是,如果你不太害怕你在循环中调用的方法的内部,你可能最好只是找到它自动释放对象的位置并修复它(通过在适当的时候明确释放对象)。 p>
答案 1 :(得分:0)
如果您没有得到任何更好的答案,请尝试使用Google perftools中的堆分析器来跟踪发生大量分配的位置。