ios中NSObject的定义
查看苹果源码可看到,苹果源码地址Source Browser
struct objc_object {
Class_Nonnull isa OBJC_ISA_AVAILABILITY;
};
其中Class为一个结构体指针typedef struct objc_class *Class;。
objc_class结构体定义为
structobjc_class {
Class_Nonnullisa OBJC_ISA_AVAILABILITY;
#if !__OBJC2__
Class _Nullable super_class OBJC2_UNAVAILABLE;
const char*_Nonnullname OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *_Nullableivars OBJC2_UNAVAILABLE;
struct objc_method_list *_Nullable*_NullablemethodLists OBJC2_UNAVAILABLE;
struct objc_cache *_Nonnullcache OBJC2_UNAVAILABLE;
struct objc_protocol_list *_Nullableprotocols OBJC2_UNAVAILABLE;
#endif
} OBJC2_UNAVAILABLE;
元类(Meta Class)的定义
isa表示一个Class对象的Class,也就是Meta Class
Category实现原理
查看分类结构体
structobjc_category {
char*category_name;
char*class_name;
struct objc_method_list *instance_methods;
struct objc_method_list *class_methods;
struct objc_protocol_list *protocols;
};
查看objc_method_list结构体
structobjc_method_list {
#if defined(Release3CompatibilityBuild)
structobjc_method_list *method_next;
#else
structobjc_method_list *obsolete;
#endif
intmethod_count;
#ifdef __alpha__
intspace;
#endif
structobjc_method {
SELmethod_name;
char*method_types;
IMPmethod_imp;
} method_list[1]; /* variable length structure */
};
查看objc_protocol_list结构体
structobjc_protocol_list {
structobjc_protocol_list *next;
intcount;
Protocol *list[1];
};
查看objc_ivar_list的定义
struct objc_ivar_list {
int ivar_count OBJC2_UNAVAILABLE;
#ifdef __LP64__
int space OBJC2_UNAVAILABLE;
#endif
/* variable length structure */
struct objc_ivar ivar_list[1] OBJC2_UNAVAILABLE;
}
methodLists表示方法列表,它指向objc_method_list结构体的二级指针,可以动态修改*methodLists的值来添加成员方法,也可以动态修改objc_protocol_list来添加protocol,也是Category实现原理,同样也解释Category不能添加属性的原因。在runtime.h可以看到它的定义:
网友评论