2011-10-18 3 views
7

:特定の..in http://clang.llvm.org/docs/AutomaticReferenceCounting.html#autoreleasepool@autoreleasepoolセマンティクス

@autoreleasepoolについて。

NSAutoreleasePoolを使用している現在の実装では、ループのループ中に定期的にプールが排除されるケースがあります。@autoreleaseプールでこれをどうやってやっていますか?

第2に、例外がスローされた場合、プールは排水されないと述べています.... ok例外は例外的な名前ですが、発生した場合、メモリの負荷がリークすることなくリカバリすることができます。ドキュメントは、これらのオブジェクトがいつリリースされるかを指定しません。

誰でもこれらのポイントについての情報がありますか?

答えて

9

、私はプールがループの反復中に定期的に排水される例を参照してください - 私たちはどのように@autoreleaseプールと同じことを行うのですか、またはそれはすべてのボンネットの下に何らかの形で私たちのために行われています?

同様に、カスケード自動解放プールによって。例えば:

@autoreleasepool { 
    … 
    for (int i = 0; i < MAX; i++) { 
     @autoreleasepool { 
      … 
     } 
    } 
    … 
} 

は、第二に、ドキュメントは、例外がスローされた場合は、プールが排出されていないと述べている.... [OK]例外は、名前で異例ですが、彼らが起こるならば、あなたが好むかもしれませんメモリの負荷がリークすることなく回復します。ドキュメントは、これらのオブジェクトがいつリリースされるかを指定しません。

ほとんどの場合、プログラムはココアの例外の特有の性質のために正常に回復することができないため、オブジェクトの漏出はそれほど問題にはならないと思います。例外のために@autoreleasepoolブロックが終了した場合、対応する自動解放オブジェクトは、囲む自動解放プールの1つがポップされたときにのみ解放されます。もちろん、@try/@catch/@finallyブロックを@autoreleasepoolブロック内に配置して、これを防ぐことができます。

+0

私はあなたの答えの2番目の部分はかなり正しいとは思いません。自動解放プールは、自動解放プール内で効果的に自動解放され、割り当てられたときに有効になります。例外が最も外側の自動解放プールを超えて伝播しない限り、自動解放されたオブジェクトはリークしません。 – JeremyP

+0

@Jerあなたは正しいです。警告ありがとう! –

+0

@Bavarious - 素晴らしい素晴らしい答えをありがとう。 'stringWithFormat'を使用している間、ループでメモリがリークしていることは確かです。 –

2

どのように我々はこのよう

@autoreleaseプールと同じかん:

for (int i = 0; i < 10000; i++) { 
    @autoreleasepool { 
     // Do your work here 
     ... 
    } 
} 

は、第二に、ドキュメントはプールISN」、もし例外がスローされると述べています排除された.... ok例外は例外的に名前が付いていますが、発生した場合は、メモリの負荷がリークすることなく復旧したい場合があります。

AFAIKこれはARCではできません。 ARCは例外セーフではありません。例外が発生した場合、回復不能なメモリリークの可能性があります。 ARCを使用するコードは、エラー報告の例外に頼ってはなりません。例外が発生すると、プロセスがクラッシュすることが予想されます。 NSAutoreleasePoolを使用して現在の実装の多くで

関連する問題