コンビニエンスコンストラクタの初期化にはselfを使う

コンビニエンスコンストラクタを実装する時はselfを使う。


(例1) User : NSObjectクラスを初期化するコンビニエンスコンストラク

+ (instancetype)userWithName:(NSString *)inName age:(NSInteger)inAge
{
    // 悪い例
    //return [[User alloc] initWithName:inName age:inAge];
    
    // 良い例
    return [[self alloc] initWithName:inName age:inAge];
}



悪い例でも動作はするが、
FreeUser : User等継承したFreeUser内でuserWithNameをコールした際、
FreeUserのインスタンス変数が正しく初期化できなくなる。


以下呼び出し時にUserが悪い例の実装のままだと、
FreeUserの保持するプロパティにアクセスした時に例外が発生する。

FreeUser *freeUser = [FreeUser userWithName:@"mike" age:40];
NSLog(@"%ld",((long)freeUser.launchCount));

(例1)でselfはメッセージを実行中のレシーバを指すので、
[FreeUser userWithName..略];とコールされた時はselfはFreeUserになり、
[User userWithName..略];とコールされた時はselfはUserとなる。