NSAutoreleasePoolを理解する助けてください.. が一つだけあるはず?
いいえ、必須ではありません。必要に応じていくつでも自動解放プールを作成することができます。
なぜあなたは よりも多く持っていたいですか? クラスの一部として1つのプールより多くの を追加したいですか?
考えてみましょう。あなたのメモリは「最高水準点」をできるだけ低く保つことです。 autoreleaseを使うことは、 "後で"まであなたのオブジェクトを解放するのをやめさせる少しの詐欺です。時には、 "後"がいつであるかを知っていることがあります。これらの場合、あなた自身のオートリリースプールを作るのはおそらく賢いでしょう。
どういう意味ですか?さて、次のループがあったとします:
for (...)
{
// 1 MB of objects are added to the autorelease pool by some code...
}
1 MBは大変です!そのコードが20回ループした場合、解放を待っているオブジェクトは20MBあります。さらに悪いことに、アプリケーションが無期限または不定期に実行された場合、アプリケーションは非常にクラッシュする可能性があります。
for (...)
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
// 1 MB of objects are added to the autorelease pool by some code...
[pool drain];
}
今すぐあなたの「ハイウォーターマーク:あなたはそのコードが自己完結型であることがわかっている場合、あなたはそうのように、手動で独自の自動解放プールを作成することにより、リリースを取得するために、そのブロック内の自動解放プールに入れます何かを強制することができます"は20MB(またはそれ以上)ではなく1MBだけです。 1 をd [自動リリース]は のために頼まれたオブジェクトが含まれています
あなたが複数のプールを持っている場合は、?
最新のもの。
グローバルスタックがあるとします。新しいAutoreleasePoolを起動すると、このグローバル自動解放プールのスタックに自身を追加します。オブジェクト上で[xxx autorelease]
を呼び出すと、自動解放メソッドはこのスタックの先頭にある自動解放プールを覗いて、その自動解放プールのオブジェクトリストに自身を追加します。 [pool drain]
を呼び出すと、そのプールは追加されたすべての参照をループし、すべてのプールで[xxx release]
を呼び出します。
BJホーマーが指摘しているように、上記の段落のスタックは実際には本当にグローバルではありません。スレッドごとにスタックが実際に1つあります。しかし、私は上記のパラグラフを書き直し、「スレッドローカル」のような言葉を使って簡単に理解できるようにすることはできませんでした... ...
これは実際にはグローバルスタックではなく、スレッドローカルスタックです。しかしそれ以外はよく書かれている。 –
@BJホーマー、ありがとう、良い点。投稿が更新されました。 – Steve