コンビニエンスコンストラクタの初期化には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となる。