初めてのObjective-C

今日は初めてObjective-Cのクラスを自前で作成してみたのでメモだ。‥ええっと環境はMacOSX SnowLeopard10.6.4、XCode3.2.4です。
空のプロジェクトに新規ターゲットで、Shellを選択し、Foundation.Frameworkを追加し、なおかつ、main.mを追加したところでそれを拡張子mmに改名したものに、以下ソースを記述してビルド&実行します。
Foundation.Framework追加しないとただのC/C++コードと戯れることができますが、追加することにより、Objective-Cを使えるようになる、そのためにやっている、という認識です。

#import <Foundation/Foundation.h>

// いきなりC++コードとの共存を実現
// 拡張子をmでなく、mmにしないと以下でおこられる。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//

// クラス「Hi」
// インタフェースの定義
@interface Hi: NSObject
-(void)SayYeah;
-(void)SayYo:(string)yo;
-(void)SayYo:(string)yo Ya:(string)ya;
@end

// クラス「Hi」
// 実装の定義
@implementation Hi
- (void)SayYeah
{
	cout <<"Yeah!" <<endl;
	return;
}
- (void)SayYo:(string)yo
{
	cout <<yo <<endl;
	return;
}
- (void)SayYo:(string)yo Ya:(string)ya
{
	cout <<yo <<ya <<endl;
	return;
}
@end

// 以上のクラスの使用事例
int main( void )
{
	id hi = [Hi alloc];
	[ hi SayYeah ];
	[ hi SayYo:"yoo" ];
	[ hi SayYo:"yoo" Ya:"yaa" ];
	return 0;
}

そして以下が実行結果だ。(これはコンソールアプリなので、XCodeの画面上にあるメニュー>実行>コンソールをクリックし、デバッグコンソールを実行前に予め出しておいたらいいだろう。)

run
[Switching to process 1415]
実行中...
Yeah!
yoo
yooyaa

Debugger stopped.
Program exited with status value:0.

自分なりに押さえたいポイントを挙げておくぞ。

  • というわけでObjective-Cの実験環境の作り方、C++コードとの共存、クラスの定義(インタフェース定義と実装の定義)と使い方(インスタンス作成とメソッド呼び出し)といった一通りのことがわけわかるようになったかも知れません。
  • @interface ClassName〜@end, @implementation ClassName〜@endという具合に、インタフェース部と実装部は分けて記述しなくてはならない。だからこのことだけで、クラス名は少なくとも2回書かなくてはならない。
  • 複数引数を受け取るメソッドではラベルというものを指定する。複数引数メソッドの定義では、(引数型)引数名という組み合わせを基本的にはコロン:で繋げて記述していくわけだが、このコロンの前に、スペースを入れ、ラベル名というものを入れることができる。何が便利なのかはいまいちまだよくわからん。
  • #includeの<>の中には、よけいなスペースを入れるとコンパイルエラーとなる。(gccがそうなのかも)
  • Obj-C特有の記述方法が満載だが、行末のセミコロンが必要なお約束はC/C++と同じ。
  • @interfaceの中の定義には、意外と中括弧の出番はない。(@endで閉じるイメージ)