alloc
またはメソッドをオーバーライドするためにこれが必要になることはめったにないことは知っていますdealloc
が、必要な場合はiPhoneプログラミングで可能ですか?
2 に答える
実際、(手動メモリ管理を使用している場合) オーバーライドdealloc
して、保持しているリソースを解放することができます (終了時に呼び出すことを忘れないでください[super dealloc]
)。オーバーライドalloc
は可能ですが、あなたが言うように、めったに必要ありません。
一般に、オーバーライドalloc
は、たとえば、使用可能なインスタンスのプールからオブジェクトを割り当てたり、外部パラメータに基づいてオブジェクトに可変量のストレージを割り当てたりする場合にのみ実行されます。(C++ では、new
パラメーターにアクセスしてそれらに基づいて割り当てることができますが、Objective-C ではパラメーターにアクセスできませんinitXXX
。)
私はこれを試したことはありませんが、ちょっとした地雷原だと思います。構造物をよく調べて、かなり注意する必要があります。
dealloc
Adam が言ったように、オブジェクトによって保持されているオブジェクトが保持されている場合は、常に (参照カウント環境で) オーバーライドする必要があります。
更新: あなたができる興味深いこと... RedClassまたはそのスーパークラスで次のようなコードを作成します:
+(id)alloc {
if (self == [RedClass class]) {
return [BlueClass alloc];
}
else {
return [super alloc];
}
}
最終的な結果は、実行[RedClass alloc]
するたびに BlueCLass オブジェクトが返されるということです。(注: おそらく BlueClass は RedClass のサブクラスであるか、オブジェクトが返された直後に事態が深刻に混乱するでしょう。)
これを行うのが良い考えだと言っているわけではありませんが、可能です (バニラのユーザー定義クラスで確実に機能しないケースについては、私は直接知りません)。そして、それにはいくつかの可能な用途があります。
追加の注意:場合によって[self isSubclassOf:[RedClass class]]
は、ではなくを使用したい場合が==
あります (ただし、これにはいくつかの重大な落とし穴があります)。