2010-12-21 64 views
1

我写了一个简单的演示为什么我的对象不是由autorelease池收集的?

@implementation A 

- (void)a{ 
    NSLog(@"%@",url); 
} 

-(id)init{ 
    self = [super init]; 
    url = [NSURL URLWithString:@"http://xxx.com"]; 
    return self; 
} 
@end 

A *a = [A new]; 
while (YES) { 
    [NSThread sleepForTimeInterval:0.5]; 
    [a a]; 
} 

,但似乎它会继续运行,永不死机。 那么何时会释放一个autorelease对象?

+0

我预计'url'将由'autorelease'池释放,然后程序崩溃。 – xhan 2010-12-21 09:41:48

回答

3

线程处于休眠状态时不会执行运行循环处理,因此主运行循环在永久循环期间不会运行,并且默认池不会收集自动释放的对象。如果你旋转的运行循环,你的代码应该崩溃就好:

[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; 

但它可能是,虽然该对象被释放的简单NSLog甚至会的工作情况。 Enabling zombies应该确保(假设你旋转运行循环)。

2

你预计会发生什么?

您只有一个NSURL实例浮动。

NSLog()的实现细节就是这样;实施细节。 NSLog()创建自己的自动释放池的可能性相同,因为它是NSLog()特殊情况"%@",因此它只记录传递对象的description;没有在池中分配。

您如何确定是否首先发生碰撞?如果暂停一秒钟,即使每次传输128字节,在分配2GB内存之前,您会看到 - 几年,几乎十年?

+0

有时一个'autorelease'对象会立即被释放,但在这个演示中它似乎不能被'autorelease'池释放。 – xhan 2010-12-22 08:04:33

+0

'autorelease'将永远不会**导致对象被立即释放。 – bbum 2010-12-22 23:43:08

相关问题