2011年1月28日金曜日

Objective-C(クラスと継承)

Objective-Cにおけるクラス定義

クラス定義は以下のように行います。主にヘッダファイル(*.h)に記述する内容です。
@interface クラス名 : スーパークラス名 { インスタンス変数定義; } メソッド宣言; @end

まあ、なんとなくイメージは付きますが、大括弧のスコープの外でメソッドの宣言をする構文は少し違和感があります。
以下、例です。
@interface Car : NSObject {
        int distance;
}
- (id) init;
@end
図1.クラス定義サンプルコード

@interfaceで始まりインスタンス変数は見たままで、メソッドの定義が大括弧の後に続きます。そして、最後に@endで終わりです。
NSObjectはスーパークラスでJavaで言うところのObjectです。Javaは無条件で継承されますがObjective-Cは明示的に記述する必要があるようです。また、Objective-Cではすべてのクラスはルートクラスを継承する必要があり、Cocoa環境ではルートクラスとしてNSObjectとNSProxyというクラスが定義されているようです。とりあえずは、NSObjectをルートクラスとしておけば良いと思います。

Objective-Cにおけるメソッド定義

上記図1サンプルにある、

- (id) init;

はid型を返却する init というメソッド定義になります。id型はすべてのオブジェクトで利用可能なオブジェクト型で、C言語でのvoid*型に似ていると思います。メソッドに引数がある場合は以下のようになります。

- (id) sampleMethod: (int) a1;

では引数が2つ以上の場合はどうなるかというと

- (id) sampleMethod: (int) a1 arg2: (int) a2;

となります。ちょっと?ですよね。第1引数はいいのですが、第2引数は「arg2」とかいうのが付いてます。これはキーワード(ラベル)です。省略も可能なようですが、コンパイル時に警告がでます。
今度はメッセージを送信する(メソッド呼び出し)場合はどうするのでしょう、以下のようにになります。

[car sampleMethod: 1 arg2: 2];

第2引数はキーワードを指定してから引数を:の後に記述します。なんかちょっとややこしいですが、メッセージのキーワードはソースを読む側からするとその引数が何を意味しているのかが、一発で理解できると思うので、慣れたらこれはこれでメリットがあると思います。

コマンドラインでのコンパイル方法

Xcodeでコンパイルすれば良いのかもしれませんが、コマンドラインからのコンパイルも出来ます。私はiOS SDKのクラスを使うまでは(どこまでがiOS SDKのクラスかはわかってないですけどw)コマンドラインからコンパイルしています。エディタはvimでターミナル上で編集しています。

[bash ]# cc ソースファイル.m -framework Foundation

としてコンパイルを実施しています。オプションは基本gccのオプションと同じようなイメージ。ですので、デバッグオプションは -g です。試してみましたが、gdbで普通にデバッグできました。デバッガに関しては特に書きませんが、無理してターミナル上でgdbを使う必要は無いとおもいます。素直にXcodeを使えばよいかと。

0 件のコメント :

コメントを投稿