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分配上做错了什么,或者我应该在创建过程中寻找其他地方?
在不知道内部结构的情况下,不可能肯定地说,但是您描述的行为听起来就像-[MineView makeOneLevel:objects:]在内部分配和自动释放对象.由于AppKit默认事件循环为其处理的每个事件创建并清理自动释放池,因此最终一切都会最终消失,但直到事件处理完毕(例如,在您的方法退出后).
最简单的解决方案是在while()循环周围包装自己的自动释放池,并在每次循环或周期性地排空它.但是,如果你不太害怕你在循环中调用的方法的内部,那么你可能最好只是找到它自动释放对象的位置并修复它(通过在适当的时候明确释放对象).
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |