2

重複の可能性:
Objective-C: ARC を使用すると、何が優れていますか? alloc または autorelease イニシャライザ?

ARC はクラス初期化子の自動解放されたバージョンを適切な自動解放されていないバージョンに自動的に変換しますか、それともまだ技術的に自動解放されていますか?

絶対に必要な期間を超えてメモリを保持したくないので、ほぼすべての状況で alloc/init を使用する習慣を身につけています。現在ARCでは、「自動リリース」イニシャライザの使用を開始して、自動リリースされていないバージョンのように動作することを期待できるかどうか疑問に思っています...

ARC の下で自動解放されたメソッドに何が起こるかを知ることができる場所に関するドキュメントはありますか?

4

3 に答える 3

2

自動解放されたオブジェクトを取得すると、コードと呼び出されたメソッド/関数の両方が ARC でコンパイルされている限り、ARC は自動解放プールを回避することができます。

ARC は、objc_retainAutoreleasedReturnValueコードにへの呼び出しを追加し、呼び出さobjc_autoreleaseReturnValueれた関数/メソッドに への呼び出しを追加します。実行時にobjc_autoreleaseReturnValue、返された値が によって保持されることを確認するとobjc_retainAutoreleaseReturnValue、オブジェクトは自動解放されず、オブジェクトを保持しないように指示するフラグが設定されobjc_retainAutoreleaseReturnValueます。allocしたがって、 /ではなく便利な作成メソッドを使用しても、(目に見える) 余分なコストは発生しませんinit

そのメカニズムの詳細については、「objc_retainAutoreleasedReturnValue はどのように機能しますか?」を参照してください。マット・ギャロウェイ著。

結論として、お好みの方法を使用してください。Apple のエンジニアが確実に高速に動作するようにします。

于 2012-06-25T18:28:42.940 に答える
0

技術的には、ARC はコードのコンパイル時に (必要に応じて) 'retains' と 'releases' をコードに挿入するだけなので、それらは同じではありません。

于 2012-06-25T17:44:23.020 に答える
0

オブジェクトを開始するときにポインタを使用すると、ARC はオブジェクトへの強い参照を保存します。それ以外の場合は、オブジェクトの割り当てをすぐに解除します。したがって、NSArray に関するあなたの質問に対する答えは、いいえ、ARC はそれを自動解放オブジェクトに変換しないということだと思います。また、オブジェクトがスコープ内で不要になったときはいつでもコードに release ステートメントを追加します。

-(void) aMethod
{
    [NSArray alloc];
}

//in essence is transformed into

-(void) aMethod
{
    NSArray *temp = [NSArray alloc];
    [temp release];
}

ポインタを格納していた場合、ARC は、オブジェクトがスコープを離れようとするとすぐにリリースを追加します。

于 2012-06-25T18:02:04.733 に答える