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);
}@endint 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);
}@endint 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);
}@endint 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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。