Objective-Cを勉強してみる - その3

これの続き。
同じくここでお勉強。

メモメモメモ

  • クラスオブジェクトというものがある。
    • 良く理解していないが、Class型として変数に保存可能らしい。
    • 存在しない場合はNil。NULLと同様に0を表す。
    • なら、NULLにしてくれれば良いのに、、、
  • クラスオブジェクトの取得
#import <stdio.h>
#import <objc/Object.h>

@interface Test : Object
+ (void)Write;
- (id)init;
@end

@implementation Test
+ (void)Write {
	printf("I love you... so please do not love me.\n");
}
- (id)init {
	printf("You can be whatever.\n");
	return [super init];
}
@end

int main() {
	Class testClass = [Test class];

	[testClass Write];
	[[testClass new] free];
	[testClass free];

	return 0;
}

うーん。メリットがイマイチ分からんなー。
書いていけば理解できるかな?
それと、最後のfreeは必要?
よく分かってないなー。

  • セレクタ!?
    • ますますObjective-Cがキモイ。なんじゃこりゃ。笑
    • メソッドがコンパイル時に変換される内部表現を直接扱えるらしい。
    • SEL型の変数として@selectorというコンパイラディレクティブで取得。
    • ObjectクラスはSEL型変数を受け取るperformメソッドが存在。
    • 受け取ったセレクタが表現するメソッドを実行するらしい。

この性質を上手く利用すれば、実行時に呼び出すべきメソッドを状況に応じて切り替えるようなプログラムを実現することができます。

うーん。実際どう使う?実感が湧かない。これもそいういう場面に出会わないと理解できそうにないなぁ。

  • メソッドのポインタ

普段は隠蔽されていますが、メソッドとは最初の引数に自分のクラスを参照するオブジェクトを受け取る関数なのです。

な、なんだって!?

    • メソッドはIMP型。このポインタを取得可能。
    • ポインタから呼んだ方がメッセージより速そう。これは良い。
  • カテゴリ
    • クラスのメソッドをカテゴリ分けして記述可能。
#import <stdio.h>
#import <objc/Object.h>

@interface Test : Object
- (void)WriteA;
@end

@interface Test (Fate)
- (void)WriteB;
@end

@implementation Test
- (void)WriteA {
	printf("I am the bone of my sword.\n");
}
@end

@implementation Test (Fate)
- (void)WriteB {
	printf("体は剣で出来ている\n");
}
@end

面白い!!これは良いかも!

    • メソッドが衝突すると継承によるオーバーライドと違い、完全に隠蔽されてしまうので注意。
  • プロトコル
    • interfaceのようなもの。
    • プロトコルの継承ができる。
    • クラスは複数のプロトコルを採用できる。
    • 採用したプロトコルで宣言されたものは、クラスで再度宣言する必要はない。
@interface クラス名 : スーパークラス名 <プロトコル1, ...>

実践では、クラスの実装に依存しない完全に抽象化された型としてプロトコルが利用されるほかに、ポインタを使わずにメソッドをコールバックさせる方法としても利用されます。

なるほど、面白い。こうやってコールバックになるのか!

とりあえず

とりあえずここは一通り呼んだ。
なんか内容が古い気もするのでObjective-C 2.0の本でも読みたいなぁ。
あと、何かコードを書いてみよ。
こことか面白そう。