1

假设我正在开发一款游戏。我数千次运行以下类方法:

NSBundle *bundle=[NSBundle mainBundle];

我没有创建一个自动释放池,并且一直释放调用上述类方法的对象。我创建了一个对象,它调用了上面的类方法,我释放了它,上千次。

3个问题:

  • 内存泄漏了吗?
  • 如果我跑:

NSAutoReleasePool *pool=[[NSAutoReleasePool alloc] init]; [池排水];

然后它会有效地释放在类方法中创建的所有那些 NSBundles 吗?

  • 如果我写道:

池=无;

而不是写:

[池排水];

能达到同样的效果吗?这是好习惯吗?

这三个问题是相互关联的,我将加强澄清它们的问题:)

4

2 回答 2

0
  1. 不,内存没有泄漏。[NSBundle mainBundle]返回一个自动释放的对象,因此自动释放池会处理它。但是,如果您要在一个函数或某事中多次调用它,您最好获得一次引用并在需要时继续使用它,或者创建自己的自动释放池.
  2. 不完全是。之后NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];自动释放的所有内容都将进入pool,并且在您排空池后,它们将被释放。注意:[pool drain];也会释放池,所以不要调用[pool drain]; [pool release];,否则您将向release对象发送两次消息并可能崩溃。
  3. pool = nil;,只会丢失对的引用,pool并且实际的pool对象会被泄露。你必须打电话给[pool drain];or[pool release];并且好的做法是在pool = nil;之后设置。
于 2010-08-14T02:30:31.123 回答
0

如果您不创建自动释放池,并且该池尚不存在,则任何自动释放的对象(由您或您正在使用的其他库)都将被泄露。

设置池=无;除了泄漏整个池之外什么都不做,也许如果池设置在一个属性中,即

 @property(nonatomic, retain) NSAutoreleasePool *pool;

 self.pool = [[[NSAutoreleasePool alloc] init] autorelease];

 //now, self is the sole retainer of pool, so if self abandons it it gets drained:

 self.pool = nil;

 //pool's retain count drops to zero, pool drains.

如果您这样做数千次,每次都可能会减慢排空池的速度,考虑每 5 或 10 次执行一次,在循环中设置一个计数器,当它达到某个确定的数字时,执行以下操作:

 self.pool = [[[NSAutoreleasePool alloc] init] autorelease];
 //this will get rid of the old pool and put in a new one, so you only have to get rid of the one remaining at the end of the loop.
于 2010-08-14T05:08:53.177 回答