CALENDAR

2010年9月
« 7月    
 12345
6789101112
13141516171819
20212223242526
27282930  

CATEGORIES

ARCHIVES

あわせて読みたい

  • LOADING...

Objective-C + NSObject

ついさっきまで、なぜ Objective-C では、NSObject や Object を
常に継承しなければいけないのかナーと思っていた。

が、どうやら言語の仕様上の問題のようだ。

すべてのクラスは、ルートクラス(すなわちNSObjectやObject)を継承しなければ、
オブジェクトとして振る舞うことが出来ない。
(参照:詳解 Objective-C 2.0)

なるほどねー。納得しました。

Objective-C は、かなり動的なことが出来るようで、以下の様なことも出来てしまう。
(先日作成したクラスを流用)

id foo =[Hoge class];
id var =[[foo alloc] init_x:10 _y:20];
printf("x:%d\n",[var getX]);
printf("y:%d\n",[var getY]);
return0;

C++よりも柔軟性が高いのはたしかだなー。

Objective-C 基礎

せっかくMacを使ってるんだからって事で、Objective-C をちょっと触ってみた。

以下、簡単な書き方メモ。

今回は、objc-1.m ファイルに全て書く。
.m が Objective-C の拡張子。

まず、インターフェースを書く。
C++でいうクラス定義みたいなもの。

#import <stdio.h>
#import <foundation/NSObject.h>
@interface Hoge : NSObject
{
	int m_x;
	int m_y;
}
-(id)init_x:(int)x _y:(int)y;
-(int)getX;
-(int)getY;
-(void)dealloc;
@end

#import でヘッダをインポート。
init_x:_y が初期化。初期化は、init で始まるメソッド名を書くのがルールらしい。
引数をつける場合は、: でつなぐ。 :( int)x が第一引数。 _y:(int)y が第2引数。
_y は省略することが出来る。_yは、引数が何を表しているのかを表す。
(int) が引数の型である。
id ってのは、オブジェクトを格納するための特別な型らしい。
Objective-C では、メッセージという考え方が基本のようなので、そのIDって感じ・・・?

インターフェースを書いたら、次にインプリメンテイション(実装)を書く。

@implementation  Hoge
-(id)init_x:(int)x _y:(int)y
{
	self =[super init];
	if( self != nil)
   {
		m_x = x;
		m_y = y;
   }
	return self;
}
-(int)getX
{
	return m_x;
}
-(int)getY
{
	return m_y;
}
-(void)dealloc
{
   [super dealloc];
}
@end

self は、インスタンスオブジェクト自体。まぁ名前の通り。
[super init] は、親クラスのinitメソッド呼び出し。
C++で書くとすると・・・NSObject::init(); かな?

最後に当然だけど、main も書く。

int main(int argc, const char * argv[])
{
	id hoge =[[Hoge alloc] init_x:5 _y:10];
	printf("x:%d\n",[hoge getX]);
	printf("y:%d\n",[hoge getY]);
   [hoge dealloc];
	return0;
}

id hoge が、生成されたインスタンスを受け取る。
[[Hoge alloc] init_x:5 _y:10] が初期化。
C++ で書くとたぶん Hoge::alloc()->init_x( 5, 10 ); だと思う。。
[hoge getX] がメソッド呼び出し。
C++ で書くと hoge->getX();

コンパイルは、以下のように書く。
Foundationというフレームワークを使っているので、指定してやる必要あり。

    cc -o hoge objc-1.m -framework Foundation

実行すると

    x:5
    y:10

と表示されて終わります。

ちなみに NSObject ではなく Object を使用した場合の変更点は、以下の通り。

#import <foundation/NSObject.h>
#import <objc/Object.h>
cc -o hoge objc-1.m -framework Foundation
cc -o hoge objc-1.m -lobjc

以上、簡単なメモでした。