【コラム】
前回は、すべてのオブジェクトはid型になることを説明したが、今回はそのオブジェクトの性質を調べる方法を説明しよう。今回説明する調査のポイントは次の2点となる。
まず、オブジェクトのクラスを調べる方法を説明しよう。すべてのオブジェクトは自分のクラスに関する情報をメタ情報として持っており、これをクラスオブジェクトという形で取得できる。
クラスオブジェクトは、classというメソッドを使ってオブジェクトから取得することができる。型は、id型を使っても良いし、クラスオブジェクトのための型Classを使うこともできる。例えば、あるメソッドにid型のオブジェクトが渡された場合、次のようなコードでクラスオブジェクトを取得可能だ。
クラスオブジェクトはクラスからも直接取得できる。この場合、同名のclassというクラスメソッドを利用する。次のコードは、NSStringクラスからクラスオブジェクトを取得する例である。
また、文字列から取得することもできる。これには、NSClassFromStringという関数を使う。この関数を使うことで、コンパイル時に存在しないクラスのクラスオブジェクトを得ることが可能となる。また、指定したクラスが実行中のランタイムに存在しない場合、不正を表すnilが返ってくるので、クラスの存在をチェックすることもできる。
さきほど説明したクラスオブジェクトを使うと、あるオブジェクトがどのクラスに属しているかを調べることができる。これには、isKindOfClass:と、isMemberOfClass:というメソッドを使う。どちらも、ルートクラスであるNSObjectのメソッドなので、すべてのオブジェクトで利用できる。
isKindOfClass:は、そのオブジェクトが指定したクラスか、そこから継承されたクラスの場合、YESを返す。isMemberOfClass:は、継承されたクラスは無視し、まさにそのクラスだった場合のみ、YESを返す。サンプルを示そう。メソッドの引数objectが、NSStringクラスに属するかどうかは、次のようなコードで調べることができる。
他にも、クラスオブジェクトから文字列を取得して調査する方法もある。クラスオブジェクトのdescriptionメソッドか、NSStringFromClass関数で、クラス名を文字列として得ることができるので、これでもチェックできる。
次に、オブジェクトの持つメソッドを調べてみよう。オブジェクトに指定したメソッドが実装されているかどうか調べることができるのだが、これにはセレクタと呼ばれるものを使う。
セレクタは、メソッドを指定するために使われ、@selector指示子にメソッド名を指定することで得ることが可能だ。また、NSSelectorFromStringという関数を使って、文字列から取得することもできる。セレクタには、SELという型が使われる。次の例では、name、setName:というメソッドのためのセレクタを作っている。
このセレクタを使うことで、メソッドが実装されているかどうかを調査できる。それには、respondsToSelector:というメソッドを使う。
上のようなコードで、そのオブジェクトがnameメソッドを実装しているどうか確認できるので、実際にメソッドの呼び出しを行える。呼び出しは直接行ってもいいし、セレクタを指定して呼び出すこともできる。それには、performSelector:というメソッドを使う。
これが、id型のオブジェクトを調査する方法だ。コンパイルの時点では、どんなオブジェクトがくるか分からないとしても、このように実行時にメソッドの存在を確認して呼び出すことができる。
だが、これだけだったら、コンパイル時に厳密に型をチェックして、そのメソッドを持っているオブジェクトが来ることを保証した方がいいのではないだろうか? ところが違うのである。Cocoaはまさにこの仕組みを直接的に利用することで、柔軟なアプリケーションフレームワークを実現しているのである。次回は、いよいよその例を紹介しよう。
| FSL、全通信方式対応のマルチモード/マルチバンドRFトランシーバLSIを発売 [14:21 2/23] |
| ISSCC 2012 - ソニー、転送速度350Mbpsを実現したTransferJet対応LSIを発表 [13:54 2/23] |
| ISSCC 2012 - パナソニック、443MB/sの書き込み速度を実現したReRAMを開発 [13:35 2/23] |
| ISSCC 2012 - IMECとルネサス、次世代広帯域無線用受信機向けADCを開発 [13:01 2/23] |
| 富士通と東北大、高精度3次元津波シミュレーションの共同研究を開始 [11:19 2/23] |
|
イメージナビ、プロの広告写真家による高品質な撮影代行サービスを開始 [14:43 2/23] クリエイティブ |
|
AppleやGoogleなどアプリストア6社、プライバシーポリシー明示に合意 [14:34 2/23] ネット |
|
【2月23日】今朝のエンタメニュース放映時間ランキングTOP10 [14:32 2/23] エンタメ |
|
FSL、全通信方式対応のマルチモード/マルチバンドRFトランシーバLSIを発売 [14:21 2/23] エンタープライズ |
|
シグマ、4,600万画素センサー搭載「SD1 Merrill」の発売日を正式決定 [14:21 2/23] 家電 |