2013/06/15

[obc]isa変数はNSObjectが持っているようだ

Appleの日本語ドキュメントにあったObjC.pdfを見ながら勉強中だ。

どうやら、クラスのインスタンスにはisa変数なるものがあるらしい。
ポインタのようなので、printfで見てみよう。

#import <Foundation/Foundation.h>
#import <stdio.h>
@interface Hell : NSObject
- (void)print;
@end
@implementation Hell
- (void)print
{
	printf("isa=%p / self=%p\n", isa, self);
}
@end
int main(void)
{
	Hell *hell = [[Hell alloc] init];
	[hell print];
	return 0;
}

yebisu:objc hirokuma$ gcc -o tst 1.m -lobjc
yebisu:objc hirokuma$ ./tst
isa=0x10782f180 / self=0x7ffd59c037e0

動くようになるまでに、かなり時間がかかった。。。
主な理由は、isa変数は自動的に持っているわけではなく、NSObjectのメンバ変数であると言うことになかなか気付かなかったからだ。
アクセス方法が悪いのかと思っていたのだが、そうではなかったのだな。

つまり、Objective-Cのクラス定義には、JavaでいうところのObjectみたいなものはなく、基底クラスを作ることができるということだ。


isa変数がなんなのかわかっていないが、vtblと同じようなものだろうと思い、selfと一緒に値を出したのだ。
しかし、アドレス全然違う。
C++も忘れかけているので、認識が間違っていたか・・・。

 

「is-a」の関係と言うことで、これは元となったクラス情報へのアクセス用なのか?
pdfには「isaインスタンス変数はオブジェクトのクラスを識別します」とある。

#import <Foundation/Foundation.h>
#import <stdio.h>
@interface Hell : NSObject
- (void)print;
@end
@implementation Hell
- (void)print
{
	printf("isa=%p / self=%p\n", isa, self);
}
@end
int main(void)
{
	Hell *hell = [[Hell alloc] init];
	[hell print];
	Hell *hell2 = [[Hell alloc] init];
	[hell2 print];
	return 0;
}

yebisu:objc hirokuma$ gcc -o tst 1.m -lobjc
yebisu:objc hirokuma$ ./tst
isa=0x10b345180 / self=0x7fad69c037e0
isa=0x10b345180 / self=0x7fad69c000e0

isaはselfによらず同じなので、認識は間違ってなさそうだ。

#import <Foundation/Foundation.h>
#import <stdio.h>
@interface Hell : NSObject
- (void)print;
@end
@implementation Hell
- (void)print
{
	printf("isa=%p / self=%p\n", &isa, self);
}
@end
int main(void)
{
	Hell *hell = [[Hell alloc] init];
	[hell print];
	Hell *hell2 = [[Hell alloc] init];
	[hell2 print];
	return 0;
}

yebisu:objc hirokuma$ gcc -o tst 1.m -lobjc
yebisu:objc hirokuma$ ./tst
isa=0x7fec324037e0 / self=0x7fec324037e0
isa=0x7fec32403830 / self=0x7fec32403830

isa変数はNSObjectの先頭に定義されているので、selfと同じアドレスに配置されることになるんだな。
isa変数が指す先が変わると、意味しているClassが変わるので、メソッドの呼び方も変わるのだろう。
C++のvtableと同じって認識でいいのかな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。