objectiveC对象模型 - 新闻资讯 - 云南小程序开发|云南软件开发|云南网站建设-昆明葵宇信息科技有限公司

159-8711-8523

云南网建设/小程序开发/软件开发

知识

不管是网站,软件还是小程序,都要直接或间接能为您产生价值,我们在追求其视觉表现的同时,更侧重于功能的便捷,营销的便利,运营的高效,让网站成为营销工具,让软件能切实提升企业内部管理水平和效率。优秀的程序为后期升级提供便捷的支持!

您当前位置>首页 » 新闻资讯 » 技术分享 >

objectiveC对象模型

发表时间:2020-10-19

发布人:葵宇科技

浏览次数:35

第一、在OC中关于对象模型,有五个根本概念,Object(实例),Class(类),Metaclass(元类),Rootclass(根类),Rootclass‘s metaclass(根元类)
typedef struct objc_class *Class;
typedef struct objc_object {
    Class isa;
} *id;
第三、每个class构造如下所示:
struct objc_class {
规矩三:metaclass 的 isa 指向根 metaclass,如不雅该 metaclass 是根 metaclass 则指向自身;
规矩一:类的实例对象的 isa 指向该类;该类的 isa 指向该类的 metaclass;
    struct objc_class * isa;
    struct objc_class * super_class;  /*父类*/
    const char *name;                 /*类名字*/
    long version;                   /*版本信息*/
   long info;                        /*类信息*/
   long instance_size;               /*实例大年夜小*/
   struct objc_method_list **methodLists;  /*办法链表*/
   struct objc_cache *cache;               /*办法缓存*/
规矩二:类的 super_class 指向其父类,如不雅该类为根类则值为 NULL;
    struct objc_protocol_list *protocols;   /*协定链表*/
};
各个字段解析:
1、name:一个 C 字符串,指导类的名称。我们可以在运行期,经由过程这个名称查找到该类(经由过程:id objc_getClass(const char *aClassName))或该类的 metaclass(id objc_getMetaClass(const char *aClassName));
第二、每一个object都有一个隐蔽的isa指针,指向class,对象构造如下所示:
2、version:类的版本信息,默认初始化为 0。我们可以在运行期对其进行修改(class_setVersion)或获取(class_getVersion)。
3、info:供运行期应用的一些位标识。有如下一些位掩码:
CLS_CLASS (0x1L) 表示该类为通俗 class ,个中包含实例办法和变量;
CLS_META (0x2L) 表示该类为 metaclass,个中包含类办法;
CLS_INITIALIZED (0x4L) 表示该类已经被运行期初始化了,这个标识位只被 objc_addClass 所设置;
CLS_POSING (0x8L) 表示该类被 pose 成其他的类;(poseclass 在ObjC 2.0中被放弃了);
CLS_MAPPED (0x10L) 为ObjC运行期所应用
CLS_FLUSH_CACHE (0x20L) 为ObjC运行期所应用
CLS_GROW_CACHE (0x40L) 为ObjC运行期所应用
CLS_NEED_BIND (0x80L) 为ObjC运行期所应用
CLS_METHOD_ARRAY (0x100L) 该标记位指导 methodlists 是指向一个 objc_method_list 照样一个包含 objc_method_list 指针的数组;
4、instance_size:该类的实例变量大年夜小(包含大年夜父类持续下来的实例变量);
5、ivars:指向 objc_ivar_list 的指针,存储每个实例变量的内存地址,如不雅该类没有任何实例变量则为 NULL;
6、methodLists:与 info 的一些标记位有关,CLS_METHOD_ARRAY 标识位决定其指向的器械(是指向单个 objc_method_list照样一个 objc_method_list 指针数组),如不雅 info 设置了 CLS_CLASS 则 objc_method_list  存储实例办法,如不雅设置的是 CLS_META 则存储类办法;
7、cache:指向 objc_cache 的指针,用来缓存比来应用的办法,以进步效力;
8、protocols:指向 objc_protocol_list 的指针,存储该类声明要遵守的┞俘式协定。
class中也有一个isa指针, 该指针指向类构造被称作 metaclass
第四、object/class/metaclass指向关系知足如下规矩
   struct objc_ivar_list *ivars;     /*实例参数链表*/
规矩四:metaclass 的 super_class 指向父 metaclass,如不雅该 metaclass 是根 metaclass 则指向该 metaclass 对应的类;
图解如下所示:

[img]http://img.blog.csdn.net/20150106150738804?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvcmljaGFyZF9ydWZlbmc=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center


第六、class与metaclass的差别
metaclass 存储类的static类成员变量与static类成员办法(+开首的办法);实例对象中的 isa 指向类构造称作 class(通俗的),class 构造存储类的通俗成员变量与通俗成员办法(-开首的办法)
class 是 instance object 的类类型。当我们向实例对象发送消息(实例办法)时,我们在该实例对象的 class 构造的 methodlists 中去查找响应的函数,如不雅没找到匹配的响应函数则在该 class 的父类中的 methodlists 去查找。
metaclass 是 class object 的类类型。当我们向类对象发送消息(类办法)时,我们在该类对象的 metaclass 构造的 methodlists 中去查找响应的函数,如不雅没有找到匹配的响应函数则在该 metaclass 的父类中的 methodlists 去查找

相关案例查看更多