3

私は、(間違っていなければ)いくつかのコードを@autoreleasepoolステートメントでラップするとARCが有効になるという本を読んでいます。まず、これですか?

私の 2 番目の懸念は、いくつかの iOS サンプル プログラムを実行しているときです。新しいプロジェクトを作成するときに ARC を有効にしていますが、このディレクティブがどこでも (自動生成されたコードで) 使用されていることはありません。これは、ARC が使用されていないことを意味しますか? 任意のアイデア/ポインタをいただければ幸いです。

4

4 に答える 4

4

@autoreleasepoolARC を「有効」にしません。これは、自動解放プールを使用する ARC の方法にすぎません。

ARC の前は、このNSAutoreleasePoolクラスを使用して、次のように自動解放プールを設定していました。

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
// Code benefitting from a local autorelease pool.
[pool release];

ただし、ARC を使用している場合は呼び出すことができないreleaseため、代わりに自動解放プールを使用する新しい方法が導入されました。

@autoreleasepool {
    // Code benefitting from a local autorelease pool.
}

@autoreleasepoolNSAutoreleasePoolブロックは、インスタンスを直接使用するよりも効率的です。ARC を使用しない場合でも使用できます。

于 2012-09-16T15:30:31.570 に答える
4

まず、本が間違っています。@autoreleasepool は ARC と直交しています。ARC なしで autoreleasepools を使用することも、autoreleasepools なしで ARC を使用することもできます (ただし、すべきではありません)。

次に、Xcode のデフォルト プロジェクトのいずれかを使用して作成されたプロジェクトのメイン スレッドには、autoreleasepool プールが作成されます。作成するスレッドは、独自の自動解放プールを作成する必要があります。

于 2012-09-16T15:40:19.717 に答える
2

一部のコードを @autoreleasepool ステートメントでラップすると、ARC が有効になります

いいえ。ARC はコンパイラ フラグによって有効になります。@autoreleasepoolは、ARC を使用している場合でも、自動解放プールを作成するために使用される単なるキーワードです (通常は、alloc-init と release をそれぞれ使用して自動解放プールを作成および破棄しますが、releaseARC の下では明示的なメッセージを送信できないため、このキーワードが導入されました。)

また、Xcode/コンパイラなどでARCを有効にすると、有効になります。確かに、「すべてを自動解放する」原則よりも優れた解決策があり、それがサンプル コードでこのキーワードに遭遇しない原因である可能性があります。

于 2012-09-16T15:27:53.697 に答える
2

私の 2 番目の懸念は、いくつかの iOS サンプル プログラムを実行しているときです。新しいプロジェクトを作成するときに ARC を有効にしていますが、このディレクティブがどこでも (自動生成されたコードで) 使用されていることはありません。これは、ARC が使用されていないことを意味しますか? 任意のアイデア/ポインタをいただければ幸いです。

あなたのアプリケーションはこれを使用します。プロジェクトのmain.mファイルをチェックアウトします。あなたはそこにそれを見つけるでしょう。

于 2012-09-16T15:45:12.480 に答える