はい、alloc
割り当てが行われる場所です。実行される場合とされない場合があり、割り当てがまったくない場合もあることに注意してください(これは実装の詳細です)。割り当ては通常、のNSObject
実装で行われalloc
ます。
メモリが割り当てられている場合、への連鎖呼び出しdealloc
は最終的にそれを解放するものです。
を呼び出した後、インスタンス変数にアクセスすることは想定されていません[super dealloc]
。これは、セグメンテーション違反が発生したことを意味するものではありません。セグメンテーション違反の場合もそうでない場合もありますが、これは未定義の動作です。
ただし、覚えておくべき重要なことは、dealloc実装自体での呼び出しを除いて、直接呼び出すべきではないということです。ObjectiveCは参照カウントです。あなたがオブジェクトを使い終わったとき、あなたはそれをしません。代わりにあなたはそれをします(またはあなたが終わったがあなたはそれを発信者に返していて、発信者がそれを使うかどうかわからない場合)。実際の呼び出しは、システムがそのオブジェクトを参照する人がもういないことを確認したときに自動的に行われます。dealloc
[super dealloc]
dealloc
release
autorelease
dealloc
編集:
割り当てがまったくない場合があることを明確にします。実際、allocを呼び出すと、通常、割り当てが発生しますが、init*メソッドによって元に戻される場合があります。原則として、へのすべての呼び出しのalloc
直後に、初期化子の1つへの呼び出しが続く必要があります。ただし、初期化子は、受信した初期化子を初期化する必要はありませんself
。代わりに、それを取り除き(したがって、メモリを解放し)、完全に異なるオブジェクトを返すことができます。これは、割り当てられている場合とされていない場合があります。
したがって、その場合、によって割り当てられたメモリalloc
は、実際には初期化子によって解放されます(それを実行するために呼び出す場合と呼び出さない場合がありますdealloc
)。また、初期化後に取得するオブジェクトは、ヒープに割り当てられておらず、解放されることのない静的オブジェクトである可能性があります。(void*)
また、 (別名id
)にキャストされて返される非ポインター(無効なアドレス)である可能性もあります。