Objective-C

クラス定義

Objective-Cのクラスは定義部と実装部に分かれており、通常定義部を.hファイル、実装部を.mファイルに記述する。後述のカテゴリによりクラス定義を複数のパートに分割できる。
// クラスの定義
@interface MyObject : NSObject {
    int val;
    id obj;
}

+ (void)classMethod:(id)arg;  // クラスメソッド
- (id)method:(NSObject*)arg1 with:(int)arg2;  // インスタンスメソッド。arg1は型付き
@end

// 実装
@implementation MyObject
+ (void)classMethod:(id)arg {
    // some operation
}

- (id)method:(NSObject*)arg1 with:(int)args2 {
    return obj;
}

// 典型的なinit
- (id)init {
    self = [super init]; // スーパークラスの呼びだし
    if(self != nil) {
        val = 1;
        obj = [[SomeClass alloc] init];
    }
    return self;
}

// deallocは自身のリソースを解放してからスーパークラスに回す
- (void)dealloc
{
    [obj release];
    [super dealloc];
}
@end
メソッドにはクラスメソッドとインスタンスメソッドがあり、それぞれ接頭辞+及び-により区別される。メソッド呼び出しの際、クラスメソッドはクラスオブジェクトに、インスタンスメソッドは各インスタンスに送信される。いわゆるコンストラクタは存在しない。慣習として新規オブジェクトの生成は+allocで、初期化は-initで行われるが、プログラマが自由に別の特殊化したメソッドを定義することが可能であり、初期化中に別の初期化メソッドを呼びだす場合もある。一方デストラクタ(ファイナライザ)に相当するものは-dealloc、またはガベージコレクション使用時の-finalizeで、これらのメソッドはオブジェクトの破壊時に必ず呼び出される。selfは特殊な変数で、メソッドの実行時にレシーバとして渡される。代入も可能であり、-init等でスーパークラスの実装で自分自身を初期化し、正しい値が返った時のみ継続して初期化を行なうなどに利用される。オブジェクトの型はオブジェクトを特定のクラスに制限したい時に用いられる。ただしこれはソースコードでのみ意味を持ち、実行レベルでは全てidとして扱われる。また型付きのオブジェクトはインスタンス変数を構造体互換でアクセスできる。保護レベルはpublic(フリー)、protected(継承クラスのみ)、private(同一クラスのみ)があり、デフォルトはprotectedである。ただメモリ管理の一貫性などの理由から、ほとんどの場合アクセサを用いる。

戻る