http://www.lifeaether.com/overtaker/blog/?page_id=1554
デリゲート
うーん。すぐに忘れてしまいます。
メッセージの応答を、別のオブジェクトに委譲するという感じでしょうか?
とても便利なデリゲートの仕組みですが、実は言語上の機能としてデリゲートが実装されているわけではありません。したがって、自分でデリゲートを利用したインスタンスを作成するには、自分でデリゲートと同じ動きをするようにクラスを作成しなければなりません。
デリゲートの保持一般に、デリゲートは delegate プロパティとして宣言されます。注意すべきは、 delegate プロパティは例外的に assign で宣言することです。デリゲートを保持してしまうと、ほとんどの場合循環参照が起こるので、 retain を使って保持してはいけません。
@property (assign) id delegate;
デリゲートメソッドの実装
特定のメソッドをデリゲートメソッドにするには、自分でメッセージ転送を行うコードを書く必要があります。典型的には、次のコードを書きます。
- (id)delegateMethod:(id)anObject { if ( [delegate respondsToSelector:@selector(delegateMethod:)] ) { return [delegate delegateMethod:anObject]; } // デフォルトの動作 }
たとえば、何かのオブジェクトを利用するとして、何かの通知が帰ってくる場合、それを受け付けるということができます。
そのオブジェクトを生成後 obj.delegate =self すると、objを生成した側に、通知がメッセージで帰ってきます。
objを生成した側は、そのメッセージを実装してもいいし、実装しなくてもいいです。