假设我正在开发一款游戏。我运行了以下类方法数千次:
NSBundle * bundle = [NSBundle mainBundle];
我不创建自动释放池并释放始终调用上述类方法的对象。我创建了一个对象,它调用了上面的类方法,我发布了它,然后开启了数千次。
3个问题:
NSAutoReleasePool * pool = [[NSAutoReleasePool alloc] init]; [池排水];
然后它会有效地释放在类方法中创建的所有NSBundle吗?
池=零;
而不是写作:
[游泳池排水];
会达到同样的效果吗?这是好习惯吗?
这三个问题是相关的,我会提出澄清它们的问题:)
答案 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)
[NSBundle mainBundle]
返回一个自动释放的对象,因此自动释放池将处理它。但是,如果你要在一个函数或其他东西中多次调用它,你最好不要一次引用它,只是在你需要它时保持它,或者创建你自己的自动释放池NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
之后的所有内容都将进入pool
,在您排空游泳池后,它们将被释放。注意:[pool drain];
也会释放池,因此请勿调用[pool drain]; [pool release];
,否则您将向对象发送release
消息两次,可能会崩溃。pool = nil;
只会丢失对pool
的引用,实际的pool
对象将会泄露。您必须致电[pool drain];
或[pool release];
,然后做好准备就是设置pool = nil;
。