首页 > 代码库 > Runtime of Objective-C 2-理解oc中的类和对象
Runtime of Objective-C 2-理解oc中的类和对象
1: 类Class:
typedef struct objc_class * Class;
从Class的定义可以看出,它是一个 objc_class 结构类型的指针,objc_class又是什么呢?
struct objc_class{ struct objc_class* isa; struct objc_class* super_class; //root的为null 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;};
为什么Class的第一个成员也是Class呢,它的内存布局岂不是和底下的object一样了?其实这就是类对象(class object)与实例对象(instance object)的区别了。
Object-C对类对象与实例对象中的 isa 所指向的类结构作了不同的命名:类对象中的 isa 指向类结构被称作 metaclass,metaclass 存储类的static类成员变量与static类成员方法(+开头的方法);实例对象中的 isa 指向类结构称作 class(普通的),class 结构存储类的普通成员变量与普通成员方法(-开头的方法).
Object-C对类对象与实例对象中的 isa 所指向的类结构作了不同的命名:类对象中的 isa 指向类结构被称作 metaclass,metaclass 存储类的static类成员变量与static类成员方法(+开头的方法);实例对象中的 isa 指向类结构称作 class(普通的),class 结构存储类的普通成员变量与普通成员方法(-开头的方法).
注意:方法、属性、和协议都存储在类定义的可写段中,这些信息可以在运行时被改变,这也是分类的实现原理。ivar存储在只读段,所以不能被修改,这是分类不能添加实例变量的原因。
下面这个例子打印NSObject能响应的选择器列表
void PrintObjectMethods(){ unsigned int count = 0; Method *methods = class_copyMethodList([NSObject class], &count); for (unsigned int i =0; i < count; ++i) { SEL sel = method_getName(methods[i]); const char *name = sel_getName(sel); printf("%s\n",name); } free(methods);}
2:对象id:
typedef struct objc_object { Class isa; } *id;
我们的根类NSObject也同样是只有一个Class成员:
@interface NSObject <NSObject> {
Class isa;
}
这个isa到底是什么呢?官方介绍是这样的:
Every object is connected to the run-time system through its isa instance variable, inherited from the NSObject class. isaidentifies the object‘s class; it points to a structure that‘s compiled from the class definition. Through isa, an object can find whatever information it needs at run timesuch as its place in the inheritance hierarchy, the size and structure of its instance variables, and the location of the method implementations it can perform in response to messages.
可见,一个对象(Object)的isa指向了这个对象的类(Class),而这个对象的类(Class)的isa指向了metaclass。这样我们就可以找到静态方法和变量了。
3: 运行时:
Objective-C的运行时是动态的,它能让你在运行时为类添加方法或者去除方法以及使用反射。这在其它语言是不多见的。
类的实例对象的 isa 指向它的类;类的 isa 指向该类的 metaclass;
类的 super_class 指向其父类,如果该类为根类则值为 NULL;
metaclass 的 isa 指向根 metaclass,如果该 metaclass 是根 metaclass 则指向自身;
metaclass 的 super_class 指向父 metaclass,如果该 metaclass 是根 metaclass 则指向该 metaclass 对应的类;
Object-C 为每个类的定义生成两个 objc_class ,一个普通的 class,另一个即 metaclass。我们可以在运行期创建这两个 objc_class 数据结构,然后使用 objc_addClass将 class 注册到运行时系统中,以此实现动态地创建一个新的类。
Object-C 为每个类的定义生成两个 objc_class ,一个普通的 class,另一个即 metaclass。我们可以在运行期创建这两个 objc_class 数据结构,然后使用 objc_addClass将 class 注册到运行时系统中,以此实现动态地创建一个新的类。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。