[iOS][objective-c] イニシャライザの管理

 objective-Cって・・・swiftじゃないんかい!!と・・・。でもイニシャライザについてはswiftでも結構ややこしそう。

http://blog.kitoko552.com/entry/2015/06/18/151130

objective-Cの場合、initをオーバーライドして、副次的イニシャライザにて[self init]をして、例えば

-(id)initWithFileName:(NSString*)name;

こんな感じで、宣言するとおもう。initのオーバーライド部にnameのデフォルト値を入れて置けばinitを呼ばれた時にエラーも吐かずにすむ。しかし、nameにデフォルト値がない場合はinitを勝手に呼び出されては困ることがある。

自分で作るサブクラスの場合は、このイニシャライザしか使えないと覚えて置けば良いが、後で使おうとした場合、initを使いかねないため、簡単にコンパイルエラーを置ける方法が紹介されていた。

-(id)init __attribute__((unavailable("init is not available")));

これをヘッダに宣言させとくと、ビルド時にエラーを吐いてくれる。注意して欲しいのが、これを記述する場合は、他に必ず指定イニシャライザを作っておくこと。もしかしたら、このクラスのサブクラスを作る場合はイニシャライザで混乱することがあるため、使わない方が良いかもしれない。

http://d.hatena.ne.jp/tanaponchikidun/20130613/1371137849