By utahta, on 6月 9th, 2008%
ついさっきまで、なぜ 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++よりも柔軟性が高いのはたしかだなー。
By utahta, on 6月 8th, 2008%
せっかく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
実行すると
と表示されて終わります。
ちなみに 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
以上、簡単なメモでした。