2010-12-21 4 views
1

私は簡単なデモなぜオブジェクトは自動解放プールによって収集されませんか?

@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

私は 'autorelease'プールによって' url'が解放され、プログラムがクラッシュすると予想しました。 – xhan

答えて

3

スレッドがスリープしている間に実行ループ処理が実行されないので、メインループは無限ループ中に実行されず、自動解放されたオブジェクトはデフォルトプールによって収集されません。

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

をしかし、簡単なNSLogは、オブジェクトが解放されていても動作すること場合があります:あなたは実行ループを回す場合は、あなたのコードはうまくクラッシュしなければなりません。 Enabling zombiesは確実にトリックを行うべきです(実行ループを回転させる場合)。

2

何が起こると思われますか?

NSURLインスタンスは1つしか浮動しません。

実装の詳細はNSLog()です。実装の詳細。 NSLog()は、NSLog()特別なケース"%@"であるため、渡されたオブジェクトのdescriptionがログに記録されるように、独自の自動解放プールを作成する可能性も同じです。プールには何も配置されていません。

最初にクラッシュを起こすかどうかはどのように判断していますか? 1/2秒の休止を仮定すると、1パスあたり128バイトを割り当てたとしても、2GBのメモリを割り当てる前に、何十年間、何十年にもおよぶだろうか。

+0

時には 'autorelease'オブジェクトが即座にリリースされることがありますが、このデモでは' autorelease'プールで解放できないようです。 – xhan

+0

'autorelease'は決してオブジェクトを即座に解放させません。 – bbum

関連する問題