web-dev-qa-db-ja.com

自動参照カウントでは、保持、解放、割り当て解除が許可されないのはなぜですか?

Xcode 4.2で自動参照カウントを使用してアプリケーションをビルドしているときに-retain-release、および-deallocを使用しようとすると、次のようなエラーが発生します。

自動参照カウントは「dealloc」の明示的なメッセージ送信を禁止します

このエラーが表示されるのはなぜですか? -retain-release、および-deallocは、自動参照カウントでは許可されなくなりましたか?

39
Jean

基本的に:

ARCを使用する場合、それは全部かゼロかです。コンパイラが保持/リリース/割り当て解除のすべてを管理しているか、何もしていません。コンパイラはそれ自体すべてを実行したいので、あなたはできないそれらへの独自の呼び出しを散在させます。これにより、不合理な最適化が行われる可能性があります(たとえば、手動メモリ管理で自動解放されたオブジェクトを返したメソッドが、自動解放プールで終わることのないオブジェクトを生成する場合があります)。保持と解放の独自の呼び出しを散りばめると、コンパイラーはこれらを処理する必要があり、必要な(そして必要な)最適化の多くを実行できなくなります。

追加のボーナスとして、-retainCountがコンパイラエラーになりました! OH HAPPY DAY!

67
Dave DeLong

自動参照カウントでは、保持、解放、および割り当て解除は許可されません。

既存のコードがある場合は、-fno-objc-arcをそのまま使用して、任意のファイルのARCを選択的に無効にすることができます。

複数のファイルでARCを無効にする場合:

XcodeのENTERキーを押して、ターゲット/ビルドフェーズ/ソースのコンパイルで目的のファイルを選択します。 (ダブルクリックするとファイルが1つだけ選択されます)-fno-objc-arcと入力しますEnterまたはDoneを押します

1
Ved Gupta

aliSoftwareへの対応:私たちCNAは、ARTCフレームワークと非ARCフレームワーク、そしてアークソースと非ARCソースを混合しています。

(やったよ..)

基本的なアイデアは次のとおりです。1)非常に優れたカカオプログラマーができるように、コンパイラーは呼び出しを挿入/削除します2)ココアは常にCコードであるため、別々のコンパイルがあるため、リンカーは複数のソースによって生成されたバイナリをリンクできます。 asmとココア、またはCとPascalを混ぜることができるので、考えてみてください。

主な意見として、c#/ Javaはここにあります:常に混合することができ、ランタイム以外のコンパイラー手法を使用します。)Appleadvantegeは、パフォーマンスを大幅に向上させることができます。

1
ingconti

Xcode ARCanswer で指摘したように、specificARC以外のソースファイル。 Dave DeLong の答えは少しずれています。 ARC対応プロジェクトでソースを非ARCとしてコンパイルするようコンパイラーに指示できるという事実は含まれていません(説明されているように here )。

0