2008-06-09

[ヒレガス本]Chapter 3. Objective-C #2

ヒレガス本、p.44あたりから。

p.45の 「"Inherits from" versus "Uses" or "Knows About"」は、むやみに継承を使うな、という主張。何でもかんでも継承を使いたくなるのはオブジェクト指向プログラミングを覚え始めたときにみんな通る道だよねえ。ともあれ、Objective-C のような動的な言語では継承を使う必要性はほとんどない、とのこと(NSObjectを継承するのは別として)。この本(ヒレガス本)の中で継承はたった2個所しか使ってないゾ、と書いてある。

p.51で LotteryEntry の実装に description メソッドを追加しているけれど、ヘッダの方には宣言を加えていない。これは - (NSString *)description が NSObject で宣言されているメソッドだから。ちなみに、この description メソッドはデバッガでオブジェクトを "print" した際に呼ばれるそうだ(ADC Home > Reference Library > References > Cocoa > Objective-C Language > NSObject Protocol Reference)。デフォルトではクラス名と id 値を表示するだけ(荻原(2.0)本、p.148より)とのことなので、クラスを作ったときは専用の description を書いておくべきだろうね。デバッグしやすいから。

p.56。Cocoa のクラスイニシャライザの中には初期化に失敗すると nil を返すものがある。スーパークラスのイニシャライザが nil を返す場合、nil チェックをして自分も nil を返すべき。

p.57。designated initializer のことは荻原(2.0)本のp.55-56に「指定イニシャライザ」として記述がある。ヒレスガ本のこのページの最後に書いてあるのは、「もし初期化の際に引数が必須となるクラスを作ったら、スーパークラスの指定イニシャライザをオーバーライドして例外をスローするようにすべし」というもの。正しい引数なしにイニシャライザが呼び出されてしまうのを防ぐため。

覚えたこと

@"some text" 記法は 7bit で ASCII な文字しか書いてはいけない。つまり、日本語なんかは書けない。荻原(2.0)本だと p.177 の「オブジェクト定数の文字列」に同様の記述がある。@"..." 記法で書かれた文字列は NSString オブジェクト定数 (a string object constant) になる。

デバッガでオブジェクトの内容を表示させるのは "po" (print-object) コマンド。「内容を表示」といっても description メソッドを呼ぶだけ。

メッセージ送信が働く仕組み

p.62と63にある記述("For the More Curious: How Does Messaging Work?")。荻原(2.0)本だと p.148からの「07-02 メッセージ送信の仕組み」にもう少し詳しく書いてある。

オブジェクト(インスタンス)へのメッセージ送信は、コンパイル時に C の関数呼び出しの形に書き換えられる。

[myOjbect addObject:yourObject];

が、

objc_msgSend(myObject, 12, yourObject);

になる。レシーバーが第1引数、第2引数はセレクタ、以後はセレクタの引数が並ぶ形。上の例でセレクタを 12 という整数値で表しているけれど、これは「例え」であって実際に SEL 型が int だというわけではない。著者は、ほんとうはchar *なんだけど、int と考えると便利だよ、と言っているだけ。荻原本だと、SEL 型に関しては以下のように記述されている:

セレクタが異なれば対応する SEL 型の値も異なり、同じセレクタには必ず同じ SEL 型の値が対応します。Objective-C のプログラマは、SEL 型が具体的にどんな値を持つかについて知っている必要はありません。詳細は処理系に依存します。

このあたりのことは「ダイナミックObjective-C」というネット上のコラムに、もう少し踏み込んだ解説がある。

0 件のコメント:

コメントを投稿