ココが違う!ActionScript3とObjective-Cのクラス定義

オブジェクト指向言語であるActionScript3を使いこなせる人ならば、Objective-Cの学習は早いと思います。しかし、ActionScript3の知識が邪魔してObjective-Cで迷ってしまうという部分も少なからずあります。ActionScript3を使える人がObjective-Cを習得するための近道として、ActionScript3とObjective-Cとを比較してみましょう。

まずはクラス定義のコードを比較してみます。

ActionScript3のクラス定義
ActionScript3でMyClassを定義するならば、クラス名と同名のMyClass.asを作り、次のような構造のコードを記述します。
package{
  public class MyClass{

  //コンストラクタ
  public function MyClass(){
  }

  //インスタンスメソッド
  public function hello():void{
    trace("ハロー");
  }
}
Objective-Cのクラス定義
Objective-CでMyClassを定義する場合は、ヘッダファイルのMyClass.hと実装ファイルのMyClass.mの2つのファイルを使います。簡単に言えば、ヘッダファイルには他のクラスからアクセスできるプロパティやメソッドの宣言文を書き、実装ファイルでプロパティの値の設定、メソッドの定義文を書きます。

ヘッダファイル MyClass.h
#import <Foundation/Fundation.h>

@interface MyClass:NSObject
- (void)hello;
@end

実装ファイル MyClass.m
#import "MyClass.h"

@implementation MyClass

- (void)hello{
  NSLog(@"ハロー");
}

@end

Objective-Cではpackageが指定してないとか、メソッドにfunctionがないとか、メソッドが-になっているとか、いろいろ突っ込みどころがありますが、ActionScript3のクラス定義とは大きな違いがあるのに気付きますか?
それは、Objective-Cのクラス定義にはコンストラクタがないという点です。ActionScript3のクラス定義でもコンストラクタを省略できますが、Objective-Cにはコンストラクタそのものがありません。では、どうやってクラスのインスタンスを作るのでしょう?次にインスタンスを作る方法を比較してみます。

ActionScript3でインスタンスを作る
ActionScript3ではnewキーワードでMyClassコンストラクタを呼び出すとインスタンスが返ります。
MyClass myObj = new MyClass();
Objective-Cでインスタンスを作る
Objective-Cにはコンストラクがありません。次のようにallocメソッドを実行してインスタンスを作ります。
MyClass *myObj = [MyClass alloc];
myObj = [myObj init];
[MyClass alloc]と[myObj init]は、Objective-Cでもっとも特徴的なメッセージ式と呼ばれる書式をしています。

メッセージ式
[オブジェクト メソッド]

[MyClass alloc]の式によってMyClassクラスのallocメソッドを実行します。しかし、MyClassクラスにはallocメソッドが定義されていません。ここで先のMyClassクラス定義のヘッダファイルをもう一度よく見てください。

MyClass.hファイル
#import <Foundation/Fundation.h>

@interface MyClass:NSObject
- (void)hello;
@end

:NSObjectという部分は、MyClassクラスがNSObjectクラスを継承していることを示しています。継承はActionScriptならば「MyClass extends NSObject」と書きますね。
そうです。allocメソッドはNSObjectクラスから継承しているクラスメソッドです。NSObjectクラスは、Objective-Cのすべてのクラスのルートクラスであり、継承したい特定のクラスがない場合には、NSObjectクラスをスーパークラスとして指定する決まりになっています。

[MyClass alloc]を実行するとMyClassのインスタンスが作られますが、このままではまだmyObjを利用できません。[myObj init]を実行することでmyObjが初期化され、インスタンスとして使えるようになります。インスタンスとして使えるようになります。allocメソッドはNSObjectクラスのクラスメソッドですが、initメソッドはNSObjectクラスで定義されているインスタンスメソッドです。
インスタンスの作成と初期化は必ず実行する手順なので、先の式は次のように1行で記述するのが一般的です。

Objective-Cでのインスタンスの作成と初期化
MyClass *myObj = [[MyClass alloc] init];
ところで、myObjの前の*はタイプミスではありませんよ。オブジェクトを入れる変数は*を付けて宣言するのです。別の言い方をすれば、*はアドレスを参照する値を示しています。

さて、インスタンスの作り方がわかったところで、MyClassで定義したhelloメソッドを実行するところまで見ておきましょう。

ActionScript3でhelloメソッドを実行する
myObjに対してドットシンタックスでhello()メソッドを実行します。
MyClass myObj = new MyClass(); //myObjを作る
myObj.hello(); //helloメソッドを実行する

Objective-Cでhelloメソッドを実行する
先ほどインスタンスを初期化するためにinitインスタンスメソッドを使ったので、もうわかりますね。
メッセージ式を使ってmyObjのhelloメソッドを実行します。hello()のようにカッコが付かない点にも注意しましょう。
MyClass *myObj = [[MyClass alloc] init]; //myObjを作る
[myObj hello]; //helloメソッドを実行する

Objective-Cのクラス定義にはまだ謎がたくさんありますが、それはまた改めて書くことにします。