使用的类方法多次导致泄漏?

时间:2010-08-14 02:20:41

标签: iphone xcode memory autorelease

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

NSBundle * bundle = [NSBundle mainBundle];

我不创建自动释放池并释放始终调用上述类方法的对象。我创建了一个对象,它调用了上面的类方法,我发布了它,然后开启了数千次。

3个问题:

  • 记忆是否泄露?
  • 如果我跑了:

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

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

  • 如果我写的:

池=零;

而不是写作:

[游泳池排水];

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

这三个问题是相关的,我会提出澄清它们的问题:)

2 个答案:

答案 0 :(得分:1)

如果您没有创建自动释放池,并且尚未存在,则会自动释放任何自动释放的对象(由您或您正在使用的其他库)。

设置pool = nil;除了泄漏整个游泳池之外什么都不做,也许如果游泳池被设置在一个房产中,即

 @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.

答案 1 :(得分: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];[pool release];,然后做好准备就是设置pool = nil;