メモ代わり。てきとーに。 いや、ですからてきとーですって。 2年前ぐらいにPythonあたりでメールくれた方、ごめんなさい。メール紛失してしまい無視した形になってしまいました。。。

2012年6月23日土曜日

[Objective-C][お勉強][メモ] ルートクラスのメソッド

クラスオブジェクトはルートクラスのインスタンスメソッドを実行する権限があるらしい。

.

[Objective-C][お勉強][メモ] クラスオブジェクトの初期化

クラスが静的変数やグローバル変数を使っている場合、initializeというメソッドで初期化するのが良いんでないかい、と書いてある。


ランタイムがinitializeメッセージを送るタイミングは以下のとおり。

1) メッセージを受信する前
2) 該当クラスのスーパークラスがinitializeメッセージを受信した後

よって、クラスは使用される前にinitializeメッセージを処理する機会が与えられる。

特に初期化する必要がなければ、initializeメソッドを実装する必要は無い。


注意点!
initializeを実装したスーパークラスObjAを継承したinitializeを実装しないクラスObjBがある場合、ObjBに対して送られたinitializeメッセージはObjBに該当するinitializeメソッドが
無いため、スーパークラスObjAのinitializeへと転送する。そのため、ObjAのinitializeメソッドが複数回実行されてしまう場合がある。

複数回実行されるのを防ぐために、以下のように実装する。

+(void)initialize
{
  if (self == [ObjA class]) {
    // ここで初期化処理
  }
}


とのこと。

2012年6月22日金曜日

[Objective-C][お勉強][メモ] クラス変数

そんなものは無い。



グローバル変数やstatic変数で代用した例。
static ObjA *objA;

@implementation ObjA;
+(id)getInstance
{
  どーのこーのどーのこーの
  return objA;
}

もちろん

static ObjA *objA;

じゃなく、

ObjA *objA;

とすることも可能。
だけど、なるべく有効範囲を限定した方が有効、とのこと。

.

[Objective-C][お勉強][メモ] インスタンス作成

allocメソッド
新しいオブジェクトのインスタンス変数を動的にメモリを割り当てる。
割り当てたインスタンス変数を0に初期化する。
クラスオブジェクトには少なくともallocのようなメソッドが1つ以上ある。

id str = [NSString alloc];

みたいな。


initメソッド
オブジェクトが有用であるためには、0で初期化するだけじゃなく
完全に初期化する必要があり、その初期化を行う。
通常allocの直後に行う。
クラスオブジェクトには少なくともinitのようなメソッドが1つ以上ある。

id str = [[NSString alloc] init];

とか。

[Objective-C][お勉強][メモ] クラスオブジェクト

ソースコード上では、クラスオブジェクトはクラス名として表される。
ex)
[NSString alloc];

メッセージ式で、単なるレシーバオブジェクトとして表される。
その他の場合、クラスまたはインスタンスに対してidクラスを返すよう要求することで
クラスオブジェクトを得られる。
ex)
id classObjDaYo = [NSString class];

NSString *strObj = [NSString @"aaa"];
id classObj2DaYo = [strObj class];

上記で、クラスオブジェクトはid型としているが、すべてのクラスオブジェクトは
Class型なので、Class型とすることもできる。
ex)
Class classObjDaYo = [NSString class];

.

[Objective-C][お勉強][メモ] 型のイントロスペクション

実行時にインスタンスがどの型かを調べることができる。
調べるためには、NSObjectのメソッドが使える。

isMemberOfClass:
レシーバが、引数で指定されたクラスであるかどうか調べる。

[objA isMemberOfClass:ObjA];

objAはObjAクラスであるかどうか。


isKindOfClass:
レシーバが、引数で指定されたクラスを継承しているか、または属しているかを調べる。

.

[Objective-C][お勉強][メモ] 継承

クラス定義は追加的に定義する。

新しいクラスはすべて別のクラスをベースとする。


NSObjecgt
ルートクラスは普通はNSObject。
NSObjectはルートクラスなのでスーパクラスが無い。
ルートクラスを定義することも可能だけど、止めといた方がいいってさ。
オブジェクトとして動作させるコードが書いてあるらしい。

インスタンス変数
普通に継承

メソッド
普通

メソッドのオーバライド
普通.

インスタンス変数のオーバライド
できない。

抽象クラス
継承されることが目的であったり、主に継承されることが目的のクラス。
通常、単独では不完全。
ただし、Objective-Cにはクラスを抽象クラスとしてマークするような構文は無い。
抽象クラスであってもallocできる。