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

为什么这个Objective-C代码分配内存的GBs,稍后再发布,而不报告任何泄漏?,objective-c,memory-management,Objective C,Memory Management,我继承了一些代码,如下所示: - (bool)makeOneLevel:(int)nummines objects:(int)numobjects { [field release]; state = gameWait; field = [[MineField alloc] createLevel:nummines objects:numobjects]; if([field rating] == -1) { return false;

我继承了一些代码,如下所示:

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

    if([field rating] == -1)
    {
        return false;
    }
...
始终分配一个雷区。无论何时创建新字段,函数所做的第一件事就是释放旧字段。如果函数成功生成雷区,则返回true

我还有这个:

while(numsaved < self.makeNumber)
{
    while(![mineView makeOneLevel:self.makeNumMines objects:self.makeNumObjects])
    {
    }
    { 
        //saving code here
    }
    numsaved++;
}
while(numsaved
在创建有效雷区之前调用函数。这一切都有效。但它在执行此操作时会分配GB的RAM。但是Leaks工具没有发现任何漏洞,当外部while完成并且操作系统重新获得控制时,所有RAM都被释放了


我是不是在雷区分配上做错了什么,还是应该在创建过程中寻找其他地方?

如果您没有得到更好的答案,请尝试从中使用堆探查器来跟踪大量分配发生的位置。

如果您没有得到更好的答案,尝试从中使用堆探查器跟踪巨大分配发生的位置。

在不了解内部情况下,无法确定,但您描述的行为听起来像是内部分配和自动删除对象。由于AppKit默认事件循环为它处理的每个事件创建并清理一个自动释放池,因此最终一切都会消失,但直到事件处理完成(例如,在方法退出之后)


最简单的解决方案是围绕
while()
循环包装您自己的自动释放池,并在循环的每一次或周期性地释放它。但是,如果您不太害怕在循环中调用的方法的内部,那么最好是找到它自动释放对象的位置并修复它(在适当的时候使其显式释放对象)。

如果不知道内部,就无法确定,但是您描述的行为听起来像是内部分配和自动释放对象。由于AppKit默认事件循环为它处理的每个事件创建并清理一个自动释放池,因此最终一切都会消失,但直到事件处理完成(例如,在方法退出之后)


最简单的解决方案是围绕
while()
循环包装您自己的自动释放池,并在循环的每一次或周期性地释放它。但是,如果您不太害怕在循环中调用的方法的内部结构,那么最好是找到它自动释放对象的位置并修复它(在适当的时候使它显式地释放对象)。

如果它在某个点释放内存,那么就不会有任何泄漏。iOS(无垃圾收集)或Mac OS X(可能使用或不使用垃圾收集)?我相信Mac OS X开启GC。我认为duskwuff已经找到了答案。如果它在某个时候释放内存,就不会有任何泄漏。iOS(无垃圾收集)或Mac OS X(可能使用或不使用垃圾收集)?Mac OS X和GC,我相信。我认为duskwuff已经找到了答案。实际上主要是Linux。但它也支持OS X和Windows。实际上主要是Linux。但它也支持OS X和Windows。更新:它现在使用NSTimer一次运行构建a级别。没有更多的内存分配。所以这就是它。更新:它现在正在运行使用NSTimer一次构建一个级别。没有更多的大规模内存分配。所以肯定是这样。