iOS笔记系列目录
一 源码分析
参考源码
/// 类方法,返回自身
+ (Class)class {
return self;
}
/// 实例方法,查找isa(类)
- (Class)class {
return object_getClass(self);
}
Class object_getClass(id obj)
{
if (obj) return obj->getIsa();
else return Nil;
}
inline Class
objc_object::getIsa()
{
if (isTaggedPointer()) {
uintptr_t slot = ((uintptr_t)this >> TAG_SLOT_SHIFT) & TAG_SLOT_MASK;
return objc_tag_classes[slot];
}
return ISA();
}
inline Class
objc_object::ISA()
{
assert(!isTaggedPointer());
return (Class)(isa.bits & ISA_MASK);
}
二 解释说明
1.当参数obj为Object实例对象**
object_getClass(obj)
与[obj class]
输出结果相同,均获得isa指针,即指向类对象的指针。
2.当参数obj为Class类对象**
object_getClass(obj)
返回类对象中的isa指针,即指向元类对象的指针;[obj class]
返回类对象本身。
3.当参数obj为Metaclass类对象**
object_getClass(obj)
返回元类对象中的isa指针,因为元类对象的isa指针指向根类,所有返回的是根类对象的地址指针;[obj class]
返回元类本身。
4.obj为Rootclass类对象**
object_getClass(obj)
返回根类对象中的isa指针,因为跟类对象的isa指针指向Rootclass‘s metaclass(根元类),即返回的是根元类的地址指针;[obj class]
返回的则是其本身。
三 总结:
1.object_getClass(obj)
返回的是obj的isa指针;
2. [obj class]
- obj为实例对象
调用的是实例方法:- (Class)class
,返回的obj对象中的isa指针; - obj为类对象(包括元类和根类以及根元类)
调用的是类方法:+ (Class)class
,返回的结果为调用者本身。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。