【コラム】
前回と同様、Objective-Cでのメソッド宣言にまつわる話を続けよう。今回は、メソッドの集合を宣言するプロトコルだ。
プロトコルは、オブジェクトの振る舞いを表すメソッドの集合を定義するものだ。@protocolという指示子で宣言する。
具体的な例を見てみよう。次のコードは、NSCodingというプロトコルを宣言するものだ。これは、オブジェクトをエンコード、デコードするためのメソッドを定義する。この2つのメソッドで、オブジェクトの保存/読み込み機能を実装する。
オブジェクトがこのプロトコルを採用することを、プロトコルに適合している、という。文法的には次のように書く。
このように宣言することで、このオブジェクトが、保存/読み込み可能という特性を持つことをアピールできるわけだ。あるオブジェクトがプロトコルに適合しているかどうかを実行中に調べることもでき、conformsToProtocol:というメソッドを使用する。
ちなみに、プロトコルではインスタンス変数を宣言することはできない。あくまで、メソッドの振る舞いに関するものだけである。
さて、そんなプロトコルであるが、どんな利点があるのだろう。実際に使ってみると分かるのは、まず、コンパイル時にメソッドのチェックをして警告を出してくれる。Objective-Cの常で、警告は出てもコンパイルは通るのだが。
だが、これはいままで説明してきたことと矛盾しないだろうか。この連載では、Objective-Cの利点は動的なメソッド判別にある、と繰り返し解説してきた。静的なメソッドのチェックを助けるような、プロトコルは何のためにあるのだろうか。
ここを理解するには、この機能が、なぜ「プロトコル」という名前なのかを知る必要がある。プロトコルという単語は、ネットワークの「通信規約」という意味などで使われることが多い、Objective-Cのプロトコルも、ここに由来するのである。
ここでいったんCocoa環境に話を移そう。Cocoaでは、オブジェクトのスレッド間、あるいはプロセス間での、メッセージ通信が実現されている。2つの異なるプロセスにあるオブジェクトが、通常のものと同じように、メッセージをやり取りすることができる。
この機能のために、プロキシとコネクションと呼ばれる機能がある。メッセージを送る際は、相手のオブジェクトの「代理人」となるプロキシを作り、メッセージをエンコードして、コネクションを通して、相手に届くことになる。
|
|
プロセス間のオブジェクト間通信 |
さて、プロセス間通信は、とても時間がかかる。パフォーマンスのために、可能な限り無駄な通信は控えたい。だが、通信時のメッセージのエンコード方法を知っているのは、通信先の相手である。相手先にメッセージの型を問い合わせるので、通信が二度手間になってしまう。
そこで、メッセージのエンコードに関する情報をあらかじめ与えるために、プロトコルが使われるのである。つまり、プロトコルには規約という意味があると書いたが、オブジェクトのプロセス間通信のための規約なのである。実際に使用するときは、プロキシに対して、setProtocolForProxy:というメソッドを使い、プロトコルを当てはめてやる。こうすることで、そのプロキシはメッセージのエンコード方法が分かることになり、無駄なプロセス間通信を減らすことができる。
|
|
プロトコルを当てはめる |
一般的に、動的な特性を利用する言語は、静的言語に比べてパフォーマンスの面で不利とされる。特に、プロセス間通信のような時間のかかる処理が絡むと、その影響はより大きくなる。そこで、あえてプロトコルを使い、静的な型をはめ込むようなことをして、この問題を回避しようとしているのだろう。
実際にCocoaのフレームワーク調べてみると、プロトコルは、ドラッグ・アンド・ドロップや、文字入力などの、プロセス間通信が必要なクラスに採用されている。パフォーマンスを上げるための努力を見ることができる。
今回は、プロトコルのプロセス間通信サポートの面に着目したが、もう一つの面である、オブジェクトの振る舞いを表す、という機能も便利である。次回は、この辺りを説明しよう。
| マイナビ、3月より書籍連動型のクリエイティブ・デザイン系セミナー開講 [12:00 2/10] |
| Linux Mint 12 KDE登場 [10:26 2/10] |
| Dell、重複排除により最大98%のデータ削減が可能なバックアップストレージを発売 [09:44 2/10] |
| 北大、「ポジトロン断層撮影法」による脳腫瘍の性質を診断する手法を開発 [09:40 2/10] |
| NICTなど、手術支援ロボット「da Vinci」の3D裸眼映像伝送実証実験を計画 [09:36 2/10] |
|
薄毛に効く? 97%が自然界由来成分「インヴァティ」発売 - アヴェダ [16:19 2/10] ライフ |
|
【レポート】CP+2012 - デザイン性重視の「K-01」に触りまくる! - リコー、ペンタックス [16:14 2/10] 家電 |
|
Behringer、iPadの入出力を拡張できるドッキングステーション発表 [16:05 2/10] クリエイティブ |
|
[スター・ウォーズ]キネクト専用ゲーム発売へ “R2-D2”デザインのXboxも登場 [15:48 2/10] ホビー |
|
桜の開花日を当てると特別金利! 池田泉州銀行が『花咲か定期預金』13日発売 [15:48 2/10] ライフ |