6

allocまたはメソッドをオーバーライドするためにこれが必要になることはめったにないことは知っていますdeallocが、必要な場合はiPhoneプログラミングで可能ですか?

4

2 に答える 2

13

実際、(手動メモリ管理を使用している場合) オーバーライドdeallocして、保持しているリソースを解放することができます (終了時に呼び出すことを忘れないでください[super dealloc])。オーバーライドallocは可能ですが、あなたが言うように、めったに必要ありません。

于 2011-09-29T11:31:47.873 に答える
6

一般に、オーバーライドallocは、たとえば、使用可能なインスタンスのプールからオブジェクトを割り当てたり、外部パラメータに基づいてオブジェクトに可変量のストレージを割り当てたりする場合にのみ実行されます。(C++ では、newパラメーターにアクセスしてそれらに基づいて割り当てることができますが、Objective-C ではパラメーターにアクセスできませんinitXXX。)

私はこれを試したことはありませんが、ちょっとした地雷原だと思います。構造物をよく調べて、かなり注意する必要があります。

deallocAdam が言ったように、オブジェクトによって保持されているオブジェクトが保持されている場合は、常に (参照カウント環境で) オーバーライドする必要があります。

更新: あなたができる興味深いこと... RedClassまたはそのスーパークラスで次のようなコードを作成します:

+(id)alloc {
    if (self == [RedClass class]) {
        return [BlueClass alloc];
    }
    else {
        return [super alloc];
    }
}

最終的な結果は、実行[RedClass alloc]するたびに BlueCLass オブジェクトが返されるということです。(注: おそらく BlueClass は RedClass のサブクラスであるか、オブジェクトが返された直後に事態が深刻に混乱するでしょう。)

これを行うのが良い考えだと言っているわけではありませんが、可能です (バニラのユーザー定義クラスで確実に機能しないケースについては、私は直接知りません)。そして、それにはいくつかの可能な用途があります。

追加の注意:場合によって[self isSubclassOf:[RedClass class]]は、ではなくを使用したい場合が==あります (ただし、これにはいくつかの重大な落とし穴があります)。

于 2011-09-29T11:44:44.187 に答える