2012-03-17 2 views
1

私はあなたが集めているようにObjective-Cをかなり新しくしていますが、最近まで、このAutoRelease Malarkyの必要性を本当に理解していませんでした。私はARCでObjective-Cを始めたことが主な理由だと思っています。Objective-CでARCを使用すると、AutoReleaseは冗長ですか?

とにかく、以前のARCは、オブジェクトを作成してメソッド/関数の戻りオブジェクトとしてポインタを返す必要があった場合、そのオブジェクトを自動解放する必要があります。 「objを返す」の後に「[obj release]」を実行します。

ARCでは、保持と解放について心配することはありません。つまり、独自のコードでは、独自のオートレリースオブジェクトを作成することに本当に意味がありますか?つまり[[[Class alloc] init] autorelease]を実行していますか?私が集めたことから、まだオートリリースプールをセットアップしておくべきですが、他のフレームワークやライブラリがオートレリースされたオブジェクトを返すかもしれないからですが、オートレリースされたオブジェクトを自分で明示的に作成する必要はありません。

おかげで、 ニック

+5

ARCコンパイルされたコードでは、 'autorelease'の呼び出しは' retain'と 'release'の呼び出しと同様に不正です。 – jlehr

答えて

3

ARCを使用する場合は、あなたが任意のメモリ管理を自分で行うにはしたくありません。具体的にはリリースと自動リリースを呼び出すことはありません。実際には、自分でメモリを管理しようとするとコンパイラはおそらく文句を言うべきです。

代わりの[[[Class alloc] init] autorelease];

あなただけの私は一般的にいくつかの本当に良いARCの背景とメモリ管理のために、この blog postを読むことをお勧めします [[Class alloc] init];

を呼ぶことにします。

+0

素晴らしいです、ありがとうございます。ブログの投稿も素晴らしいです! N –

0

まあ、あなたの理解はかなり正しいです。 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を使用している場合、それ以上必要ではないということ。

関連する問題