iPadの開発を目指して、思い付き、objective-cを始めました。思い付きなものだから、途中でやめるかもしれないし、三日坊主かもしれないし、と。まぁ、C/C++/C#/Java以外の言語体系を学んでおくのも悪くないでしょう。
■cygiwnでobjective-cをインストール
そんな訳で、手元にはmacがありません(苦笑)ので、cygwinを使って、objective-cを勉強します。最終的には、Xcodeを使ってmac上で作らないと駄目なのですが、文法なところとかロジックのテストなところとか、そういうOSに関係ないところは、どの環境でもできるはずなので手元のwindows環境でやります。
Objective-CをWindowsで利用するために
http://take-blizzard.cocolog-nifty.com/blog/2009/01/objective-cwind.html
なところで、objective-cのインストールについて説明があります。
cygwinのDevelカテゴリの「gcc-objc」をインストールします。
コンパイルするときは、
gcc sample.m
ですね。クラスを使うときは、objc ライブラリを必要とするので、
gcc sample.m -l objc
とします。
ひとまず、
#import <stdio.h> #import <objc/Object.h> int main( void ) { printf("Hello objective-c World.\n"); return 0; }
がコンパイルできればOKです。
# printf関数を使っているところが弱いですが。
■文法のお勉強
文法に関しては、C++/C#/Javaのいずれかを理解していると学習が早いでしょう。
というか、いきなり objective-c を学ぶのは辛いかな、と。C言語を学んだあとに、引き続き objective-c に進むか、C++ から鞍替えするかがいいと思います。
Objective-C入門
http://wisdom.sakura.ne.jp/programming/objc/index.html
Objective-C Beginner’s Guide
http://www.otierney.net/objective-c.html
Objective-CをWindowsで利用するために: ページアウトされた記憶の残骸
http://take-blizzard.cocolog-nifty.com/blog/2009/01/objective-cwind.html
あたりを参照しながら、ゆっくりと進むのがいいでしょう。
オブジェクト指向言語なので、基本はC++やJavaなんかと同じです。
書き方が微妙なところがあるので、そのあたりが迷いますが、頭の中に対応表を持っておけば、直ぐに慣れるでしょう。
# メソッド呼び出しに [obj method] っていう括弧を使うのが、うーむって感じなのです。smalltalk がそうなのかな?
クラスに関しては、ざっと記述すると、こんな感じになりますね。
#import <stdio.h> #import <objc/Object.h> @interface Point : Object { // インスタンス変数 int _x, _y; } // クラスのメソッド - (void)init ; - (void)print; - (void)setPoint:(int)x:(int)y; - (int)add; - (int)getX; - (int)getY; @end @implementation Point // コンストラクタ - (void)init { [super init]; // 親クラスのコンストラクタを呼び出し } // 引数のない関数 - (void)print { printf("x:%d y:%d\n", _x, _y ); } // 引数のある関数 - (void)setPoint:(int)x:(int)y { _x = x; _y = y; } // 戻り値を使う - (int)add { return _x + _y; } // プロパティ扱い - (int)getX { return _x; } - (int)getY { return _y; } @end int main() { // インスタンスを生成 Point *pt = [Point new]; // メソッド呼び出し [pt setPoint: 10: 20 ]; // メソッド呼び出し [pt print]; // プロパティ呼び出し printf("x:%d y:%d\n", [pt getX], [pt getY] ); // 戻り値を使う int ret = [pt add]; printf("ret:%d\n", ret ); // 解放 [pt free]; return 0; }
メソッドの定義と呼び出しが、C言語と違って妙な感じですが、まぁ、これも慣れですね。C言語の関数を使わなければ、[obj method: p1: p2]な形が羅列されるので、それほど違和感はないかもしれません。
■NSStringの問題
と、ここまで書いてですね、iPhone SDKでは「NSString」という文字列クラスが多く使われているのを思い出しました。調べてみると、cygwinのobjective-cには NSString がありません。
困った…
こういう場合は、GnuStep をダウンロードしてきて、やるか。
http://www.gnustep.org/
cygwin版のNSStringを作ってしまうか、ですね。
http://osdir.com/ml/lib.gnustep.user/2001-09/msg00030.html
にあるように、gnustep-objc-1.0.1.tar.gz をダウンロードして、cygwinのgccでビルドして使うってのもありですが、、、ちょっと大袈裟だなぁ。
# Windows環境で試す意義としては、学習用とビジネスロジック作成にあるので、
# 文字列クラス程度であれば、スタブで用意しておくのがいいでしょうねぇ。
# ユーザーインターフェースなんかは、結局 interface builder を使わないと
# 駄目だかろうから、mac osx 上でないとできないだろうし。
あぁ、それでもって、cygwinのobjcを使って、nsstringもどきを作ろうとしたのですが、どうもcygwinのobjcはコンパイルの動きが違うようです。多重定義ができない、というかメソッドの引数にラベルを使えない。このあたりは後日。
先の例で言えば、
– (void)setPoint:(int)x:(int)y;
は可能だけど
– (void)setPoint x:(int)x y:(int)y;
ができません。ややこしいこっちゃ。
★追記
ひとつ目の引数には名前がつけられないらしい。
– (void)setPoint :(int)x y:(int)y;
だと、通りますね。
—
追記 2012/01/03
という訳で、cygwin でも objective-c の学習はできるのですが、本来の目的が iphone/ipad プログラミングの場合は、GNUstep + clang + llvm という組み合わせになります。以下のページを参照してください。
Windowsで学ぶObjective-C | Moonmile Solutions Blog
http://www.moonmile.net/blog/article/windows-objective-c
GCCだとNXConstantStringっていう文字列クラスが付属してませんか?
cygwin版のobjcだと、NXConstantStringしか付いていないので、cocoaとかのライブラリを作る場合に不便なわけです。なので、続きは、GNUstepをインストールしてmingw版を使うということで。