dealloc メソッドのステートメントの順序は重要ですか? [super dealloc]
メソッドの一番上にある必要はありますか?それは問題ですか?
また、例えばviewDidLoad
。[super viewDidLoad]
メソッドの一番上にあるべきですか?
それは絶対に重要です。
何をするかは、自動参照カウント(ARC)を使用しているか手動参照カウントを使用しているかによって異なります。
Manual Release-Retain(MRR)は、Mac OS Xのすべてのバージョンのデフォルトのメモリ管理であり、Xcode4.2までのメモリを処理する唯一の方法です。
MRRでは、メソッドの最後[super dealloc]
にある必要があります。
したがって、コードは次のようになります。
- (void)dealloc
{
[member release];
[super dealloc];
}
スーパーdeallocは実際にメモリを解放します。それについて考えてください。その後、次のようにインスタンス変数にアクセスする場合:
[super dealloc];
[member release];
...これは、インスタンス変数が潜在的に無効であることを意味します。スーパーdeallocの呼び出しとメンバー解放の呼び出しの間に、理論的には、メンバーポインターを格納するバイトが別のものに変更された可能性があります。
Appleがメモリ管理プログラミングガイドで説明しているように:
Deallocメソッドの役割は、オブジェクト自体のメモリを解放し、オブジェクトインスタンス変数の所有権を含む、オブジェクトが保持するすべてのリソースを破棄することです。
これを行うには、オブジェクトが保持しているリソースを破棄し、を呼び出し[super dealloc]
ます。これは、保持しているオブジェクトを破棄し、スーパーと呼びます。などなど、最終的にルートオブジェクトがインスタンス自体によって使用されているメモリを空きとしてマークするまで続きます。戻るまで[super dealloc]
に、インスタンスは解放されています。(もちろん、その中のポインターはおそらく有効ですが、それはあなたが信頼すべきではない実装の詳細です。)
一般に、構築(またはロード)するときは、スーパーに最初に作業を任せます。物事を壊すときは、最初にあなたの仕事をしてください。
参照:
自動参照カウント(ARC)は、Xcode4.2で導入されたメモリ管理を行うための新しい方法です。ARCを使用すると、コンパイラはアプリケーションのコンパイル時にメモリ管理コードを追加します。使用する前にもっと読みたいと思ういくつかのしわがあります(ほとんどの場合、古いOSバージョンとの互換性は限られています)。
ARCを使用すると、電話をかけることはまったくありません(電話[super dealloc]
をかけることもできません)。代わりに、終了[super dealloc]
時に呼び出されます。dealloc
参照:
Deallocメソッドのステートメントの順序は重要ですか?[スーパーdealloc]はメソッドの最上位にある必要がありますか?それは重要ですか?
それは最後に行くべきです。アイデアは、「私が行ったすべてのビットを破棄したので、今度は私の親クラスに同じことをさせます」と言うことです(再帰的に)
また、例えばviewDidLoadで。[super viewDidLoad]をメソッドの先頭に配置する必要がありますか?
一番上に行く必要があります。親クラスは、サブクラスがパーツをロードする前に、ビューをロードするために必要なことを実行する必要があります。これは、親クラスが最初に設定する必要があるものに依存している可能性があるためです。