カプセル化の破壊を抑える為setterは出来る限り使わず、
以下の指定イニシャライザの利用を推奨させたい時(initを呼べない様にしたい)
- (id)initWithName:(NSString *)inName age:(NSInteger)inAge
ヘッダにclang language extentionsを書けば[[Foo alloc] init];の呼び出し時にコンパイルエラーにできる。
- (id)init __attribute__((unavailable("init is not available")));
強引に呼ばれてしまった場合は
Foo *foo = [[Foo alloc] performSelector:@selector(init:)];
NSAssertやraise:format等で例外を発生させinitを使わせなければよい。
- (id)init { [NSException raise:NSGenericException format:@"Disabled. Use +[[%@ alloc] %@] instead", NSStringFromClass([self class]), NSStringFromSelector(@selector(initWithName:age:))]; return nil; }
[参考]
stackoverflow Is it possible to make the -init method private in Objective-C?