2

たとえば、NSMutableArray:

NSMutableArray* a1 = [[NSMutableArray alloc] initWithCapacity:10];
NSMutableArray* a2 = [NSMutableArray arrayWithCapacity:10];

手動参照カウントでは、2 行目で自動解放されたオブジェクトが返されました。ARC を有効にすると、2 番目は __autoreleasing オブジェクトを返し、もう 1 つは返しませんか? もしあれば、違いは何ですか?

初期化しようとしているクラスが、ARC に変換されたカスタム クラスであり、変換によって初期化子から autorelease メッセージが削除された場合:

MyClass b1 = [[MyClass alloc] initWithNumber:1];
MyClass b2 = [MyClass myClassWithNumber:1];

// MyClass implementation of myClassWithNumber
+(id) myClassWithNumber:(int)num
{
    return [[self alloc] initWithNumber:num];
}

b1 と b2 に違いはありますか? a1 と a2 の作成方法と違いはありますか?

4

1 に答える 1

0

LearnCocos2D、

ARCは呼び出し規約を変更しません。メソッドの名前がMRRで自動解放されたオブジェクトを返す場合、ARCでオブジェクトを返します。ARCは、各メソッドのローカル最適化です。そのため、同じプロジェクトでMRRコードとARCコードを組み合わせて組み合わせることができます。(カテゴリでさえ、異なるメモリ管理方法を持つことができます。)

2番目のコード例では、必要に応じて、ARCが戻り値に自動解放を追加します。なぜそれが最後なのですか?ARCは部分的にメモリフットプリントを最小化することを目的としているためです。したがって、メソッドで作成されたすべてのオブジェクトの存続期間を管理する必要があります。自動解放されるメソッドで作成された唯一のオブジェクトは、戻り値です。

一般に、ARCはコードへの侵入を最小限に抑えると想定されています。基本的に、メモリ管理の責任はコンパイラに委ねられます。(とにかく常に存在するはずだった場所。)フリーダイヤルのブリッジCFオブジェクトをObjective-Cコードに取り込む際のARCサーフェスの問題。ほとんどの場合、フリーダイヤルのブリッジアイテムは__bridgedストレージ修飾子を使用して処理されます。AppleのドキュメントはARCに関して非常に優れています。Clangのドキュメントは正確です。

ARCを発汗させないでください。最新のコンパイラの場合と同様に、おそらくメモリの管理はあなたよりも優れています。

アンドリュー

于 2012-06-01T13:20:38.850 に答える