浮于表面探究问题不失为一种方法,但是弄清楚本质才是真正意义上的解决疑惑。
之前写的一篇博客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为实例对象和类对象,代码如下所示:
//类方法直接返回自身指针
+ (Class)class {
return self;
}
//实例方法调用object_getClass,返回isa指针
- (Class)class {
return object_getClass(self);
}
通过上面代码可以看出,调用[obj class],不管obj对实例对象还是类对象,结果都是一样的。这也验证了之前写的一篇博客object_getClass(obj)与[obj class]的区别的结论。
通过查看源代码,不仅理解上更深刻,而且不必写过多的测试代码,事半功倍。