为什么我的对象不是由自动释放池收集的?

时间:2010-12-21 08:49:54

标签: objective-c memory-management

我写了一个简单的演示

@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];  
}

但似乎它会继续运行而不会崩溃。 那么什么时候会释放自动释放对象?

2 个答案:

答案 0 :(得分:3)

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

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

但即使对象被释放,简单的NSLog也可能会起作用。 Enabling zombies应该可以肯定(只要你旋转运行循环)。

答案 1 :(得分:2)

您期望发生什么?

您只有一个NSURL个实例浮动。

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

您如何确定是否应该首先发生崩溃?给出1/2秒的暂停,即使每次传递分配128个字节,在分配2GB内存之前,你会看到 - 几年,差不多十年? -