2010-12-21 62 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

相關問題