fatal error: method definition not in @implementation context – macosx.com
「method definition not in @implementation」とか出るんだけど意味がわかりません。
→循環参照じゃね?
→id使えば解決さ
→お前ら、idで誤魔化さずにちゃんと型つけて返せよ。。。
なんかgccが出すObjectiveCのエラーは問題の本質がわからなくするようなエラーばかり出す気がする。
確かに循環参照しているときは面倒なのでidにしたら何も考えずには済みますが。
Hoge* hoge = [[[Hoge alloc]init]autorelease];
id*hoge2 = hoge;
[hoge2 func];/*Hogeにfuncがあったらこれでいけちゃう*/
この手のダックタイプ的なコードとかって個人的には好きではないのです。
・protcolが実装されていない場合。
・implementsがちゃんと入っていない場合。
・型に存在しないプロパティ、関数を呼ぶ場合
は問答無用でコンパイルを止めて欲しいものです。
BestSoftwareWriting では、動的言語であろうが、静的言語であろうが関係なくて、
テストをいかに堅牢に作成するかが鍵です。みたいなことを書いていましたが今は
あんまり信用していなくて、関数のシグネチャが変わったとき等はちゃんとコンパイラは
全てに対して警告を出すべきだと思うようになりました。
シグネチャが変わった際にそれが影響を受ける実装部は宣言部分からは明らかではないから。
結局記憶力便りになってしまっている気がする。
オチ無し。
追記:
じゃあどうやって解決しているのさ?という話です。
余りキレイだとは思えないかもしれませんが、
・ヘッダには構造体orプロトコルをimportする場合に限りimportを書く
・そうでない場合は全て前置宣言で済ます。
・ヘッダのimportは.m内でのみ行う。
こうすると各.mがimportだらけになってしまいますが、
大してコンパイル速度が落ちるということは無いのでひとまずこれでといったところ。