これはからの抜粋ですObjective-C runtime programming guide
:
新しいオブジェクトが作成されると、そのオブジェクトのメモリが割り当てられ、そのインスタンス変数が初期化されます。オブジェクトの変数の最初は、そのクラス構造へのポインターです。isaと呼ばれるこのポインタは、オブジェクトにそのクラスへのアクセスを提供し、クラスを介して、継承元のすべてのクラスへのアクセスを提供します。
isaは次のNSObject
ように宣言されます。
Class isa;
その順番Class
は、構造体へのポインタにすぎません。
typedef struct objc_class *Class;
そして今、この構造を見てみましょう:
struct objc_class {
Class isa;
#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE;
struct objc_method_list **methodLists OBJC2_UNAVAILABLE;
struct objc_cache *cache OBJC2_UNAVAILABLE;
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE;
#endif
}
最新バージョンのObjective-Cでは、スーパークラス(および別のisaを除く構造体の残りのすべてのメンバー)へのポインターが使用できないことがわかります。
だから私の質問は、super_class
ポインタが利用できない場合、オブジェクトがそのスーパークラスにアクセスする方法を教えてください。この別のisaポインタを介してスーパークラスにアクセスできますか?しかし、それはどのように正確に起こりますか?使い方?誰かがそれを説明できますか?