cygwinでobjective-cを学ぶ(1)

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

 

 

カテゴリー: 開発 パーマリンク

cygwinでobjective-cを学ぶ(1) への2件のフィードバック

  1. nil のコメント:

    GCCだとNXConstantStringっていう文字列クラスが付属してませんか?

  2. masuda のコメント:

    cygwin版のobjcだと、NXConstantStringしか付いていないので、cocoaとかのライブラリを作る場合に不便なわけです。なので、続きは、GNUstepをインストールしてmingw版を使うということで。

コメントは停止中です。