objcでinitの呼び出しを抑制する

カプセル化の破壊を抑える為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?