まあ、あなたの理解はかなり正しいです。 ARCでは、これ以上のリリースや自動解放はありません。ただ、私たちがもう必要ではないオブジェクトへの参照にnil(または他の妥当な値)を割り当てるようにしてください。最悪の場合、メモリを増やしても常にメモリを消費することができますが、メモリには鉱石が漏れることはありません。
また、ARCを使用しない可能性があるフレームワークライブラリ(リンクされたもの)を使用するために、自動解放プールを維持しています。
autoreleaseの目的についてのご質問にお答えします。これはもちろん、非ARCプロジェクトにのみ適用されます。 古き良き時代、Objective-Cは参照カウントを提供していませんでしたが、そのカウントは保持されていました。保持されていない(または保持カウントが0である)オブジェクトの割り当てメモリは空きとみなされ、間もなく他のオブジェクトによって要求され、使用される可能性があります。 これは、すべてのオブジェクトを割り当て後に保持しておく必要があることを前提にしています。オブジェクトがそれ以上使用されないときは、それを解放する必要があります。これには2つのリスクが伴います。つまり、allocは自動的に一度保持します。 1)使用していないオブジェクトを解放することを忘れるかもしれません。最悪の場合は、それ以来、メモリ内に存在するオブジェクトへの参照をすべて失うことさえあります。 2)オブジェクトハットがまだ解放されていることを参照してから、BAD_EXC例外で終了する可能性が高いオブジェクトにアクセスしようとします。
これはすべて非常に面倒なことがあります。非常に長く滞在しないオブジェクトに対するこれらの義務の一部を取り除くために、オートリリースが発明されました。一時オブジェクトの場合、それを割り当て(release-count = 1)、それを自動解放します。つまり、オブジェクトは、次の自動解放サークル内で自動的に解放されます(カウントが1減らされます)。しかし、オブジェクトは実行中にメソッドに割り当てられたままになります。通常、参照変数はローカル変数です。
サンプル:
-(void) myMethod{
AClass *someObject = [[[AClass alloc] init] autorelease];
// use the object
// probably hand it to another object if that takes ownership, i.e. add it ot an Array using addObject:
// don't care any more
}
とARCを使用している場合、それ以上必要ではないということ。
ARCコンパイルされたコードでは、 'autorelease'の呼び出しは' retain'と 'release'の呼び出しと同様に不正です。 – jlehr