書かれているとおりに手順を追って、RandomeApp を作ってみた。この程度のことは以前にもやったことはあったけど、まあ、それでも実際に手を動かしてみると楽しいものだ。
覚えたこと
Interface Builder で GUI 部品とコントローラなんかのインスタンスを結び付けるときの Ctrl-Drag の方向。メッセージを送る方から送られる方へ線を引く。ボタンなら、ボタンを押したときにメッセージがコントローラに送られるのだから、ボタンからインスタンスへ。テキストフィールドなら、関連づけられたインスタンス変数が変わったときに表示されるテキストが変わるようにしたいのだから、コントローラからテキストフィールドへ。メッセージの方向だと覚えれば良い。
調べたこと
awakeFromNib
が気になった。調べてみた。NSNibAwaking
という非形式プロトコル(informal protocol)だった。
非形式プロトコルって何?
ヒレガス本(p.297-298)によれば、2.0より前のObjective-Cで、デリゲート・メソッドを宣言するための "ugly" な手段だったということ。
荻原(2.0)本だと、p.272-274あたりに「非形式プロトコル」の説明がある。その最後の部分を引用すると、
従来は上の例のように、メソッド群のすべてが必ずしも必要でない場合、非形式プロトコルで宣言されるのが普通でした。Objective-C 2.0ではオプション付きのプロトコルが使えるようになりましたので、今後はプロトコルの利用が増えてくるものと思われます。
オプション付きのプロトコルって何よ?
プロトコルは Java の interface。荻原本(2.0)によれば Java の方がマネしたとのことだけど、まあそれはどっちでも良い。いわゆる「振舞いによる類型」を実現するための仕組みだ。平たく言うと「インタフェースの共有」ね。
で、2.0 より前の Objective-C ではあるプロトコルを採用(adopt)するとなったら、そこで宣言されたメソッドをすべて実装する必要があった。この仕組みだと先に出てきたデリゲート・メソッドの宣言に使うには都合が悪かったようだ。で非形式プロトコルのような "ugly" なやり方を取っていた、と。
これを解消するためなのかどうかは不明だけど、2.0 からはプロトコルを宣言するときに @optional
と @required
というコンパイラ指定子を使えるようになった。荻原本(2.0)のサンプルを抜き出しておく。
@protocol Alarm - (void)setCurrentTime:(NSDate *)date; - (BOOL)alarm; - (void)setAlarm:(BOOL)flag; @optional - (BOOL)snooze; - (void)setSnooze:(BOOL)flag; @required - (void)setTimerAtHour:(int)h minute:(int)m; @end
プロトコルに適合しているかどうかを conformsToProtocol
で実行時にチェックできるのだけど、@optional
なメソッドに関してはこれではチェックできない。調べるにはメソッドごとに respondsToSelector:
でチェックする。
じゃあ、次はデリゲートって何、ってことを調べようと思ったけど、時間切れ。今夜はここまで。
0 件のコメント:
コメントを投稿