menu
書いてる野郎
orebike@gmail.com
作ったクラスの扱いにかんしては→こちら
Objective-CのクラスはNSObjectクラスを頂点とする単一継承になる。
宣言自体は
hogehoge.h
のようなヘッダーファイルに書かれる
クラス宣言はこのように記述する。クラス名はJavaとか同様にパスカル記法になる。
Objective-Cのクラスの宣言はinterfaceというキーワードからわかるように、 全体がJavaのインタフェースか抽象クラスみたいになっていて、実装は無い。
@interface Hoge : NSObject{ //メンバ変数の宣言部 } //メソッド宣言部 @end
コロンに続いてスーパークラスを書く。スーパークラスは明示的に書く必要があるっぽ。
なので特に指定がないならクラス階層の頂点であるNSObjectクラスを指定しておく
@から始まるキーワードで挟まれた部分はObjective-C独特の拡張部分でC言語とはまったく違った記述になっている。
これは普通の変数宣言と同じ。可視性は知らん。
int hoge;
ハイフンに続き括弧を書いてその中に戻り値の型を書く。次にメソッド名を書く。 メソッド名はラクダで書くようだ
引数が無いなら、ここでおしまい。さっきも言ったように実装は無い
- (id)hogePiyo;
引数アリなら
- (id)hogePiyo: (int)abc;
複数引数があってセレクタ付きなら
- (id)hogePiyo: (int)abc fuga:(int)xyz;
戻りが無いならvoidを指定しておく
- (void)hogePiyo;
クラス宣言が終わったら次は実装。宣言したクラスのメソッド実装を書いていく。 実装自体は
hogehoge.m
のようなファイルに書かれる。拡張子のmは主にメッセージの実装が書かれるからmらしい。 Objective-Cではクラスの宣言部と実装部を分離して記述する。
実装ということからもimplementationというキーワードが使われる。
implementationキワードに続き実装対象のクラス名(今ならHoge)を書く。
@implementation Hoge //宣言したメッセージの実装部 @end
Javaのインタフェースと同様にクラス宣言で宣言したメソッドは実装部で実装を強制される
引数無し版はならばこうなる
- (int)hogePiyo{ int a = 1; int b = 2; int c = a + b; return c; }
引数アリなら仮引数も書いて
- (int)hogePiyo: (int)abc fuga:(int)xyz{ int a = abc + xyz; return a; }
こうなる。結局セレクタであるfugaは宙ぶらりんでなんも使われないのだが・・・こういうところがObjective-Cのキモさに繋がっているのだろう。
他の言語ではコンストラクタにあたる機能。
オブジェクトの生成自体はallocメソッドでやってしまうので、初期化は慣例的にinitというメソッドを作ってこっちで書くようになっている。
ここでオブジェクト内部状態を整える。
イニシャライザは定番の実装があって
- (id)init{ self = [ super init ]; if(self == nil){ return nil; } //ここから初期化処理ズラズラ return self; }
このように書く。
まとめると、
ということ。
内部でスーパークラスのイニシャライザを呼び出して自分自身を更新している。 勘違いしやすいのはinitはコンストラクタではなくて単なる初期化用メソッドということ。
なのでinit呼び出しの時点でもうオブジェクトとしては存在(alloc)していて、 selfの内容を入れ替えているように見えるが、結果的に同じ値がグルグルしているだけ。
初期化のミスをnilで判定しようという設計になっているだけ。
オブジェクト内部だけで使うサブルーチン的なメッセージをどう実装するか?
クラスのメソッド実装部に書けばOK
Javaならthisにあたる概念。
Objective-Cではメソッド中でselfで参照できる。
なので
id hoge = self;
とやったり
[ self piyo ]
とやったりできる。
面白いのはJavaのthisのようにキーワードではなくselfがオブジェクトに標準で備わっている単なるメンバということ。 そしてallocされた時に自身の参照が自動的に突っ込まれるということ。
単なるメンバなのでselfの内容を任意のものと取り替えることができる。
スーパークラスのメソッド呼び出しはsuperというキーワードを使ってできる。
[ super piyo ]
こんな感じ。