【コラム】
前回までは、メソッドを操作するランタイムAPIを紹介してきたので、次は当然インスタンス変数の出番だ。今回は、インスタンス変数を取り扱うための、構造体を紹介しよう。
Objective-Cのクラス定義には、既に述べたようにメソッドの定義が含まれていて、さらにインスタンス変数の定義も含まれている。objc_class構造体に含まれている、instance_sizeとivarsが、それだ。
instance_sizeは、このクラスが持つインスタンス変数の合計サイズになる。言い換えれば、このクラスのインスタンスを作成したときに、確保されるメモリの大きさ、という訳だ。ivarsの方が、インスタンス変数の定義になる。この変数は、objc_ivar_list構造体へのポインタになる。この構造体の定義は、次の通りだ。
名前の通り、objc_ivarという構造体の配列を管理するためのものだ。ivar_countは配列の数、objc_ivarが配列になる。さて、ここまでくればもう感付いている方もいると思うが、このobjc_ivarがインスタンス変数の定義となる構造体である。その定義は、次の通りだ。
この構造体には、3つのフィールドがある。1つ目のivar_nameは、インスタンス変数の名前になる。2つ目のivar_typeは、変数の型だ。この型は、メソッドの型と同じ形にエンコーディングされている。型のエンコーディングについては、本連載の第20回を参考にしてほしい。そして、3つ目のivar_offsetは、この変数がメモリ内部でどこに配置されるかを表している。インスタンス変数のために確保したメモリの、先頭からのオフセットになる。
また、この構造体のポインタを表すための型も定義されている。Ivarという名前の型だ。
実際のコードでは、こちらを使うことも多いだろう。
では、このIvarを利用して、クラス定義からインスタンス変数の定義を抜き出すコードを紹介しよう。次のコードでは、すべてのインスタンス変数の名前を表示している。
まず始めに、Class型の変数に、ivarsが存在しているかどうかを確認している。インスタンス変数定義が無い場合、このフィールドはNULLになっているので、注意が必要だ。
次に、objc_ivar_list構造体の、ivar_countの値を表示している。これが、インスタンス変数の定義の数になる。そして、forループを回して、Ivarを取り出している。Ivarからは、ivar_nameにアクセスして、インスタンス変数の名前を調べることができる、という訳だ。
この方法で調査できるのは、指定したクラスに含まれるインスタンス変数だけだ、ということにも注意しておこう。つまり、親クラスのインスタンス変数の名前は表示されない。それらを表示するには、superclassの定義を調査することが必要になる。
次回は、このIvarを使って、インスタンス変数の値にアクセスする方法を説明しよう。
| 理研、脳・脊髄形成に必要な神経板湾曲の仕組みを解明 [20:16 5/25] |
| 京大、「慢性閉塞性肺疾患」患者の労作時呼吸困難は鍼治療が有効と実証 [20:08 5/25] |
| 120Hz SHVカメラ用イメージセンサーを使った撮像装置 - SHVフルスペック化へ [18:10 5/25] |
| 京大、視覚による物体認知は前頭前野からのトップダウン信号が重要と確認 [17:45 5/25] |
| 製品数の拡大だけでなくBCPの展開なども含めた総合力で事業の強化を図るTI [17:25 5/25] |
|
[9nine]制服姿見納め? セーラー服で登場も川島海荷「4人はコスプレ」 [19:15 5/27] エンタメ |
|
「NO.6」4巻は書き下ろしドラマCD付、木乃のサイン会も [18:49 5/27] ホビー |
|
[今週の新刊]マンガ大賞3回ノミネート「アイアムアヒーロー」 カープ愛「球場ラヴァーズ」も [18:33 5/27] ホビー |
|
「ゆりてつ」サイン会は作者と都電に揺られるツアー仕立て [17:45 5/27] ホビー |
|
【ネタバレもありの徹底解明コラム】『サザエさん』タマの意外な事実 [17:30 5/27] ホビー |
4つの診断で、自分の適性を見つめなおそう!
働くこと・挑戦し続けることへの思いを綴ったインタビュー
あなたにピッタリのアドバイスを読むことができます。
転職に必要な情報が収集できます
企業からアプローチのメッセージが届きます。