Apple LLVM compilerと無名カテゴリ

探し方がよくないのか、ドキュメントが見つからなかったのでメモ。 どっかに記述があるなら誰かおせーてください;;

Xcode3.6.5で利用出来るコンパイラは ・GCC 4.2 ・LLVM GCC 4.2 ・LLVM compiler 1.7

Xcode4.1.0が ・GCC 4.2 ・LLVM GCC 4.2 ・Apple LLVM compiler 2.1

Xcode4.2.0で ・LLVM GCC 4.2 ・Apple LLVM compiler 3.0

と、なっていた・・・はずΣ

ここでObjective-Cのカテゴリについて。 Xcode4.2/iOS5.0SDKにしてOpenGL Gameテンプレートでプロジェクトを作成した時に不思議な記述発見Σ

.m内で無名カテゴリが記述されていて、以前のOpenGLESのテンプレートではここはカテゴリの実装同様関数名(と、プロパティ宣言)だけだったんだけど、今回ここに変数名が宣言されていた。

該当部分がここ。

以前のソース

@interface OpenGLViewController ()
@property (nonatomic, retain) EAGLContext *context;
@property (nonatomic, assign) CADisplayLink *displayLink;
- (BOOL)loadShaders;
- (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file;
- (BOOL)linkProgram:(GLuint)prog;
- (BOOL)validateProgram:(GLuint)prog;
@end

新しくなったソース

@interface OpenGLViewController () {
    GLuint _program;

    GLKMatrix4 _modelViewProjectionMatrix;
    GLKMatrix3 _normalMatrix;
    float _rotation;

    GLuint _vertexArray;
    GLuint _vertexBuffer;
}
@property (strong, nonatomic) EAGLContext *context;
@property (strong, nonatomic) GLKBaseEffect *effect;

- (void)setupGL;
- (void)tearDownGL;

- (BOOL)loadShaders;
- (BOOL)compileShader:(GLuint *)shader type:(GLenum)type file:(NSString *)file;
- (BOOL)linkProgram:(GLuint)prog;
- (BOOL)validateProgram:(GLuint)prog;
@end

あれ?カテゴリん中に何宣言してんだ!!!ってなったわけで。 いろいろ調べてみると、LLVM GCCではやはりエラー。でもApple LLVM compilerを使うとすんなり通る。 ただし、無名カテゴリの時だけで、カテゴリとして記述する場合は変数宣言するとエラーが出る。

元々、無名カテゴリの時は、関数の実装をオリジナルのクラスの実装部分に書いておかないと警告が出る。 カテゴリ名を入れると、まぁ、カテゴリだから当然だけど、オリジナルに実装を入れていなくても警告は出ない。 別ファイルで宣言すればいいもんね。

カテゴリ自体がクラスの拡張みたいなものなんだけど、無名カテゴリにした場合、本当にクラス拡張って感じに。 これでますますプロパティが隠蔽することができるようになっている。

これが使えるのはどうもApple LLVM compiler 2.1以降? そもそも1.0ってのはあったの? LLVM compiler 1.7って書いてあったけど、これがApple LLVM compilerでいいのかな? ちなみに1.7ではエラーだった。

LLVM GCCでは使えないけど、Apple LLVM compilerでは使えるってことはこの記述方法はApple独自のってことでいいのかな?

いろいろ調べても英語だらけで、それなりに読んでたつもりなんだけど、どうも見つけ出すことができなかった;;

GCCLLVM GCCApple LLVM compilerの違いがどっかに整理されてたりしないのかな? 誰か教えて偉い人!!

結局Apple LLVM compilerを使わずにGCC 4.2と互換性のある?LLVM GCCを使って開発してきたんだけど、Xcode4.2でプロジェクトを開くと、「古いコンパイラ使ってるけどそれでええんかいな?新しいのに置き換えたろか?」って警告が出てくるんだけど、すんなり置き換えてもいいのか迷いどころ。

あ、ちなみに参考にしてたところはここです>http://llvm.org/

そういえば。 AdobeのAfterEffectsSDKがXcode4には対応してないって形に修正されてた。 何回やってもXcode4でコンパイルとおらなかったんだよね。 コンパイラはGCC4.2にしてたにもかかわらず、Xcode3.6だったらいけるのにXcode4にするとエラーがでまくりんぐ! OpenGL使ったサンプルが。

iPhoneの開発する分には流れでApple LLVM compilerへ切り替えていく感じでいいのかなって思ってるけど、別のでXcode使ってるとちょっと困るよね。

iOS5になって不具合でまくりで対応に追われて涙でそうだし、がらっと代わっちゃって今とってもいっぱいいっぱい。

4.3なら動くのに5だと動かないって現象がいろんなプロジェクトで発生しちゃってもう大変><。

OpenGLで描画してたのが真っ黒になったり、よくわかんないところで落ちちゃったり。 リリースノートとかAPI diffとか読み込んだけど、まだ解決でけてない。どうにかせんといかんΣ

対応策が見つかりますように・ω・` がんばるぞいっと!