iPhoneアプリ開発で一番最初につまづくポイント。それはデリゲート(delegate)ではないでしょうか?私もしっかりつまづきました。
android開発から入った僕にとって、デリゲートはよくわからない存在でした。が、最近分かってきました。delegateとは、直訳すると、委託するとか委任するとかそういうものですよね。イメージで言うと、この処理は誰にやってもらうのか、を明確に決めておくと言った感じです。

androidアプリではボタンのクリックイベントを取るときに
button.setOnClickListener( xxx );
xxxの部分にView.OnClickListenerを継承したオブジェクトを渡しますよね?
このxxxにあたるものがdelegateです。

クリックイベントや、タップイベントなど、決まった動作に対して、必ず呼ばれるメソッドがあります。
androidではonClickメソッド。iPhoneではtouchesメソッドがそれにあたります。

androidでも自分(Activity)にOnClickListenerを実装して、xxxの部分にthisを入れるように、iPhoneでも、.hファイルのクラス名の横に<>をつけて、その中に実装するDelegateクラスを書けば、delegateにselfを渡すことができます。

要するに、DelegateはJavaでいうところの、抽象クラスですね。
似たようなものにprotocolというのがObjective-Cにありますが、これはJavaでいうinterfaceです。

ここでJava出身者が困るポイントとしては、抽象メソッドを全てオーバーライドしていなくてもインスタンス化できてしまうところです。Objective-Cは動的な型付けを採用しているため、実行時に探して、ないことに気づくという仕組みです。まぁ、どっちが楽かって言う話もあるかもしれませんが、、、とりあえず全てオーバーライドしていなくても問題ありません。

protocolはJavaでいうinterface、delegateはJavaでいう抽象クラスに近いと思います。



Objective-Cで、Javaでいう匿名クラスで必要な時に簡単に抽象クラスをインスタンス化できたらいいな~って思っていたのですが、どうやらブロックスを使うとできるみたい?です。
次回はその辺について書けたらいいな~と思います。

では。



.