object_getClass(obj)と[obj class]の違い-ソースコード解析
1320 ワード
表面に浮かんで問題を探究するのは一つの方法だが、本質を明らかにすることこそ真の意味での疑問解決である.
前に書いたブログobject_getClass(obj)と[obj class]の違いをコードテストでobject_を探索getClass(obj)と[obj class]の違いは、たぶん両者の違いが分かっていて、使用上区別できるようになったのですが、今はちょっと苦労しているようで、その理由が分かりません.
最近object-runtimeのソースコードを読み始め、object_を見ましたgetClass(obj)と[obj class]のコードを実装すると,一目瞭然である.
object_getClass(obj)のコード実装:
そのうち_object_getClass(obj)は静的インライン関数であり、コードは以下のように実現される.
簡単に言えばobject_getClass関数は、オブジェクトを返すisaポインタです.
[obj class]のコード実装は、objがインスタンスオブジェクトとクラスオブジェクトの2つのケースに分けられ、コードは以下のようになります.
上記のコードから、[obj class]を呼び出すと、objがインスタンスオブジェクトに対してもクラスオブジェクトに対しても、結果は同じであることがわかります.前に書いたブログobjectも検証されましたgetClass(obj)と[obj class]の違いの結論.
ソースコードを表示することで、理解が深まるだけでなく、テストコードを書きすぎなくても、半分の仕事ができます.
前に書いたブログobject_getClass(obj)と[obj class]の違いをコードテストでobject_を探索getClass(obj)と[obj class]の違いは、たぶん両者の違いが分かっていて、使用上区別できるようになったのですが、今はちょっと苦労しているようで、その理由が分かりません.
最近object-runtimeのソースコードを読み始め、object_を見ましたgetClass(obj)と[obj class]のコードを実装すると,一目瞭然である.
object_getClass(obj)のコード実装:
Class object_getClass(id obj)
{
return _object_getClass(obj);
}
そのうち_object_getClass(obj)は静的インライン関数であり、コードは以下のように実現される.
static inline Class _object_getClass(id obj)
{
#if SUPPORT_TAGGED_POINTERS
if (OBJC_IS_TAGGED_PTR(obj)) {
uint8_t slotNumber = ((uint8_t) (uint64_t) obj) & 0x0F;
Class isa = _objc_tagged_isa_table[slotNumber];
return isa;
}
#endif
if (obj) return obj->isa;
else return Nil;
}
簡単に言えばobject_getClass関数は、オブジェクトを返すisaポインタです.
[obj class]のコード実装は、objがインスタンスオブジェクトとクラスオブジェクトの2つのケースに分けられ、コードは以下のようになります.
//
+ (Class)class {
return self;
}
// object_getClass, isa
- (Class)class {
return object_getClass(self);
}
上記のコードから、[obj class]を呼び出すと、objがインスタンスオブジェクトに対してもクラスオブジェクトに対しても、結果は同じであることがわかります.前に書いたブログobjectも検証されましたgetClass(obj)と[obj class]の違いの結論.
ソースコードを表示することで、理解が深まるだけでなく、テストコードを書きすぎなくても、半分の仕事ができます.