/usr/include/objc/objc.h和runtime.h找到对class和object的定义
**typedef struct objc_class *Class; //一个objc_class的指针
typedef struct objc_object {
Class isa;
} *id;** //id(任意对象)是一个objc_object结构类型的指针
objc_class的结构体:
struct objc_class
{
struct objc_class* isa;
struct objc_class* super_class;
const char* name;
long version;
long info;
long instance_size;
struct objc_ivar_list* ivars;
struct objc_method_list** methodLists;
struct objc_cache* cache;
struct objc_protocol_list* protocols;
};
isa:是一个 objc_class 类型的指针,看到这里,想起我前面的引申解读了没?内存布局以一个 objc_class 指 针为开始的所有东东都可以当做一个 object 来对待! 这就是说 objc_class 或者说类其实也可以当做一个
objc_object 对象来对待!对象是对象,类也是对象,是不是有点混淆?别急,ObjC 发明(or 重用)了 一个术语来区分这两种不同的对象:类对象(class object)与实例对象(instance object)。OK,名 称混淆的问题解决,下面我将使用这两个术语来区分不同的对象,而使用“对象”这一术语来泛指所有的对 象。ObjC 还对类对象与实例对象中的 isa 所指向的类结构作了不同的命名:类对象中的 isa 指向类结构 被称作 metaclass,metaclass 存储类的 static 类成员变量与 static 类成员方法(+开头的方法);实 例对象中的 isa 指向类结构称作 class(普通的),class 结构存储类的普通成员变量与普通成员方法(- 开头的方法)。
一张类关系的继承图来说明类继承之间的关系:
一些runtime的函数使用
- Class objc_allocateClassPair ( Class superclass, const char *name, size_t extraBytes );
创建一个类,返回新类对象的指针。 - class_addMethod(Class aClass, @selector(), (IMP)functioin,”v@:”)
- 3.