initializeが二回呼ばれてへこー

クラスオブジェクトに対するメソッド、

+(void)initialize
{
    // クラスオブジェクトの初期化
}

はそのクラスが始めて使われる場合に呼び出される。
ただし、
継承階層にあるクラスが継承先でinitializeを実装していない場合、
その継承先クラスが始めて使われる場合も、
initializeがスーパークラスに対して呼ばれてしまう。
即ち、

Chara
+(void)initialize

Hoge : Chara
//...

とあった場合、
Charaが使われる場合にinitializeが実行され、
Hogeが使われる場合にもCharaのinitializeが実行される。
二回初期化が呼ばれて大抵おかしくなる。
荻原本では、

+(void)initialize
{
    static BOOL nomore = NO;
    if (nomore) {
        return;
    }
    ...
    nomore = YES;
}

のようにすることを推奨している。
ぐああああああああああああ。
はまった。