我写了一个简单的演示
@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];
}
但似乎它会继续运行而不会崩溃。 那么什么时候会释放自动释放对象?
答案 0 :(得分:3)
线程休眠时没有进行运行循环处理,因此主循环循环永远不会在无限循环期间运行,并且默认池不会收集自动释放的对象。如果你旋转运行循环,你的代码应该崩溃就好了:
[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.1]];
但即使对象被释放,简单的NSLog
也可能会起作用。 Enabling zombies应该可以肯定(只要你旋转运行循环)。
答案 1 :(得分:2)
您期望发生什么?
您只有一个NSURL
个实例浮动。
NSLog()
的实施细节就是这样;实施细节。同样可能NSLog()
创建自己的自动释放池,因为它是NSLog()
特殊情况"%@"
,因此它只记录传递对象的description
;没有在游泳池中分配。
您如何确定是否应该首先发生崩溃?给出1/2秒的暂停,即使每次传递分配128个字节,在分配2GB内存之前,你会看到 - 几年,差不多十年? -