比较简单,只是记录一下知识点。
一、 Class
1.网上扣了一张图片:
image.png
Class 的一个结构。
关于为什么&FAST_DATA_MASK
是一种计算位域方法,取出对应位域的值,具体可以看之前写的一篇探究 isa 本质
。
2.class_rw_t 真实定义:
class_rw_t
:读写、运行时调用方法都是取之于此、类的初始内容、分类的内容。
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;
};
class method_array_t :
public list_array_tt<method_t, method_list_t>
{
typedef list_array_tt<method_t, method_list_t> Super;
public:
method_list_t **beginCategoryMethodLists() {
return beginLists();
}
method_list_t **endCategoryMethodLists(Class cls);
method_array_t duplicate() {
return Super::duplicate<method_array_t>();
}
};
method_array_t
->method_list_t
->method_t
3.class_ro_t 真实定义:
class_ro_t
:只读、包含的是类的初始内容。
struct class_ro_t {
uint32_t flags;
uint32_t instanceStart;
uint32_t instanceSize;
#ifdef __LP64__
uint32_t reserved;
#endif
const uint8_t * ivarLayout;
const char * name;
method_list_t * baseMethodList;
protocol_list_t * baseProtocols;
const ivar_list_t * ivars;
const uint8_t * weakIvarLayout;
property_list_t *baseProperties;
method_list_t *baseMethods() const {
return baseMethodList;
}
};
method_list_t
-> method_t
4.method_t
真实定义:
struct method_t {
SEL name;
const char *types;
IMP imp;
};
SEL name
:方法名字,方法选择器
const char *types
:方法类型,字符串表示,方法编码
IMP imp
:函数指针,函数实现地址
5.Type Encoding
iOS中提供了一种@encode的指令,可以将具体类型用字符串表示出来。
image.png
NSLog(@"%s",@encode(id));
2018-09-03 11:51:37.186767+0800 runtime[1030:38253] @
网友评论