在Xcode中,点击Class直接跳转
typedef struct objc_class *Class;
发现Class就是一个结构体objc_class
类型的指针
struct objc_class {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class _Nullable super_class OBJC2_UNAVAILABLE;
const char * _Nonnull name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list * _Nullable ivars OBJC2_UNAVAILABLE;
struct objc_method_list * _Nullable * _Nullable methodLists OBJC2_UNAVAILABLE;
struct objc_cache * _Nonnull cache OBJC2_UNAVAILABLE;
struct objc_protocol_list * _Nullable protocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
看到class中包含,isa指针,版本,类名,方法列表,协议列表,等等。
发现除了isa,其他的已经过期了。我们来看一下最新的objc的源码的方法之类的列表都是怎么获取的
objc下载源码:https://opensource.apple.com/tarballs/objc4/
下载下面最新的代码,打开
找到objc_class结构体的实现
image.png
objc_class继承自objc_objc_object
变量只有一个isa
image.png
我们来看下
class_rw_t
这个结构体中就存放了class的方法,属性,协议等相关信息
struct class_rw_t {
// Be warned that Symbolication knows the layout of this structure.
uint32_t flags;
uint32_t version;
const class_ro_t *ro;
method_array_t methods;
property_array_t properties;
protocol_array_t protocols;
Class firstSubclass;
Class nextSiblingClass;
char *demangledName;
#if SUPPORT_INDEXED_ISA
uint32_t index;
#endif
void setFlags(uint32_t set)
{
OSAtomicOr32Barrier(set, &flags);
}
void clearFlags(uint32_t clear)
{
OSAtomicXor32Barrier(clear, &flags);
}
// set and clear must not overlap
void changeFlags(uint32_t set, uint32_t clear)
{
assert((set & clear) == 0);
uint32_t oldf, newf;
do {
oldf = flags;
newf = (oldf | set) & ~clear;
} while (!OSAtomicCompareAndSwap32Barrier(oldf, newf, (volatile int32_t *)&flags));
}
}
如何获取到这些信息的呢?
class_data_bits_t bits; // 用于获取具体的类信息
class_rw_t *data() {
return bits.data();
}
class_rw_t* data() {
return (class_rw_t *)(bits & FAST_DATA_MASK);
}
最终的结构如下:
image.png
网友评论