1. ホーム
  2. objective-c

[解決済み] ARCを使用する場合、deallocでプロパティをnilに設定するのですか?

2022-08-13 22:57:57

質問

私はiOS 5のAutomatic Reference Countingを学ぼうとしています。さて、この質問の最初の部分は簡単なはずです。

  1. を行うことは正しいのでしょうか? ではない を明示的に書く必要があるということですか? を書く必要はないのでしょうか?つまり というのは本当でしょうか? ではない は明示的な deallocは必要ないのでしょうか?

    @interface MyClass : NSObject
    @property (strong, nonatomic) NSObject* myProperty;
    @end
    
    @implementation MyClass
    @synthesize myProperty;
    @end
    
    
  2. 次の、より重要な質問は ARC リリース ノートへの移行 という文書にあります。

    <ブロッククオート

    インスタンス変数を解放する必要はありません(実際できません)。しかし、システムクラスやARCを使ってコンパイルされていない他のコードでは、[self setDelegate:nil]を呼び出す必要があるかもしれません。

    どのシステムクラスがARCでコンパイルされていないのか、どうすればわかるのでしょうか?いつ私自身の dealloc を作成し、強く保持するプロパティを明示的に nil に設定すべきでしょうか? プロパティで使用されるすべての NS および UI フレームワーク クラスは明示的な dealloc を必要とすると仮定すべきでしょうか?

手動参照追跡を使用するときにプロパティのバッキング IVar を解放するプラクティスについて、SO や他の場所で豊富な情報がありますが、ARC を使用するときにこれについては比較的少ないです。

どのように解決するのですか?

短い答え : いいえ。 dealloc のプロパティを無効にする必要はありません。

長い回答 : でのプロパティは決してnil outしてはいけません。 dealloc にあるプロパティは、たとえ手動でのメモリ管理であっても、決してnil outしてはいけません。

MRRでは アイバー . プロパティを解放するということは、セッターを呼び出すということであり、セッターは dealloc で触れるべきでないコードを呼び出すかもしれません (例えば、あなたのクラスやサブクラスがセッターをオーバーライドしている場合など)。同様に、KVOの通知も引き起こすかもしれません。代わりに ivar を解放することで、これらの望ましくない動作を回避することができます。

ARCでは、システムは自動的にあなたのためにivarを解放するので、もしあなたがしていることがすべてなら、あなたは dealloc . しかし、特別な処理が必要なオブジェクトでない四角形がある場合 (例えば、割り当てられたバッファで free() に必要な割り当てられたバッファなど) がある場合は、それらの扱いは dealloc .

さらに、もしあなたが自分自身を何らかのオブジェクトのデリゲートとして設定しているのであれば、その関係を dealloc (を呼び出すことです。 [obj setDelegate:nil] ). ARCでコンパイルされていないクラスでこれを行うことについての注意は、弱いプロパティに対するうなづきのようなものです。もしクラスが明示的に delegate プロパティを weak というプロパティを指定した場合は、weakプロパティの性質上、このような処理を行う必要はありません。しかし、もしそのプロパティが assign と書かれている場合は dealloc そうしないと、クラスはポインタがぶら下がったままとなり、デリゲートにメッセージを送ろうとすると、おそらくクラッシュします。これはデリゲートのような非保持関係にのみ適用されることに注意してください。