为什么这个Objective-C代码分配GB的RAM,稍后发布,而不报告任何泄漏?

Alm*_*lmo 1 memory-management objective-c

我继承了一些代码,它看起来像这样:

- (bool)makeOneLevel:(int)nummines objects:(int)numobjects
{
    [field release];
    state = gameWait;
    field = [[MineField alloc] createLevel:nummines objects:numobjects];

    if([field rating] == -1)
    {
        return false;
    }
...
Run Code Online (Sandbox Code Playgroud)

总是分配一个MineField.每当你创建一个新字段时,该函数所做的第一件事就是释放旧字段.如果函数成功生成MineField,则返回true.

我也有这个:

while(numsaved < self.makeNumber)
{
    while(![mineView makeOneLevel:self.makeNumMines objects:self.makeNumObjects])
    {
    }
    { 
        //saving code here
    }
    numsaved++;
}
Run Code Online (Sandbox Code Playgroud)

在创建有效的MineField之前调用该函数.这一切都有效.但它在执行此操作时会分配GB的RAM.但Leaks工具没有发现泄漏,当外部完成并且操作系统获得控制权时,所有RAM都被解除分配.

我在MineField分配上做错了什么,或者我应该在创建过程中寻找其他地方?

dus*_*uff 6

在不知道内部结构的情况下,不可能肯定地说,但是您描述的行为听起来就像-[MineView makeOneLevel:objects:]在内部分配和自动释放对象.由于AppKit默认事件循环为其处理的每个事件创建并清理自动释放池,因此最终一切都会最终消失,但直到事件处理完毕(例如,在您的方法退出后).

最简单的解决方案是在while()循环周围包装自己的自动释放池,并在每次循环或周期性地排空它.但是,如果你不太害怕你在循环中调用的方法的内部,那么你可能最好只是找到它自动释放对象的位置并修复它(通过在适当的时候明确释放对象).