ObjectiveC的对象模型和runtime机制「建议收藏」腾讯云开发者社区

对象(Object):OC中基本构造单元(buildingblock),用于存储和传递数据。

能够在objc.h的文件里查找到对象结构的定义,例如以下所看到的即对象结构为Class类型的isa,而Class是objc_class结构类型指针。

objc_class即我们理解的类对象结构。其也包含一个isa类对象结构指针。

类和对象的终于实现都是一种数据结构,(subclassisaninstanceofsuperclass)

///Representsaninstanceofaclass.structobjc_object{ClassisaOBJC_ISA_AVAILABILITY;};代码语言:javascript复制///Apointertoaninstanceofaclass.typedefstructobjc_object*id;代码语言:javascript复制///AnopaquetypethatrepresentsanObjective-Cclass.typedefstructobjc_class*Class;代码语言:javascript复制structobjc_class{ClassisaOBJC_ISA_AVAILABILITY;#if!__OBJC2__Classsuper_classOBJC2_UNAVAILABLE;constchar*nameOBJC2_UNAVAILABLE;longversionOBJC2_UNAVAILABLE;longinfoOBJC2_UNAVAILABLE;longinstance_sizeOBJC2_UNAVAILABLE;structobjc_ivar_list*ivarsOBJC2_UNAVAILABLE;structobjc_method_list**methodListsOBJC2_UNAVAILABLE;structobjc_cache*cacheOBJC2_UNAVAILABLE;structobjc_protocol_list*protocolsOBJC2_UNAVAILABLE;#endif}OBJC2_UNAVAILABLE;类(类对象)、元类(元类对象)和实例对象的关系一个完整的类应该包含类方法、实例方法和成员变量(实例变量),每一个对象都包含一个isa(isaclass)指针指向类对象(执行时方法发送给对象消息,才确定类别并调用相应的方法实现)。类对象结构中记载了类的全部信息。

类对象的isa指向元类对象(metaclass),类对象中的方法列表是实例方法(-,instancemethods)。元类对象中的方法列表是类方法(+,classmethods)

上述理解能够通过以下代码和对象变量结构分析来进行确认。

(2)每一个类对象都有一个isa指向唯一的Metaclass

(3)每一个元类对象的isa指针都指向NSObject的元类对象

消息传递(Messaging):在对象之间传递数据并执行任务的过程

Objective-C基于C语言加入了面向对象特性和消息转发机制的动态语言。除编译器外还须要用Runtime系统来动态创建类和对象进行消息发送和转发。

不同语言有不同函数传递方法,C语言-函数指针,C++-函数调用(引用)类成员函数在编译时候就确定了其所属类别,Objective-C通过选择器和block。

[receivermessage];并不会立即执行receiver对象的message方法的代码。而是向receiver发送一条message消息,该句话被编译器转化为:

idobj_msgSend(idself,SELop,…);

PS:消息调用函数还存在特殊情况,如其它函数objc_msgSend_stret//待发送消息返回结构体objc_msgSend_fpret//返回浮点数objc_msgSendSuper//给超类发消息

SEL表示方法选择器,结构例如以下:typedefstructobjc_selector*SEL。,可通过关键字@selector()获得

id数据结构在第一部分:对象模型中已经有定义。

obj_msgSend发消息流程:

Method数据结构runtime.h头文件里定义:

typedefstructobjc_method*Method;structobjc_method{SELmethod_name;//特殊的字符串。描写叙述方法名,能够通过关键字@selector()获取char*method_types;IMPmethod_imp;}PS:消息转发分为两大阶段即动态加入方法解析(dynamicmethodresolution)和完整的消息转发机制(fullforwardmechanism)

runtime系统是一个用C语言编写动态链接库,核心是消息分发。Runtime机制包含对象模型。消息传递和转发。方法实现机制和其它执行时方法。能够实现动态创建改动类对象和对象等功能,消息传递和转发,方法动态实现,MethodSwizzling等功能。

##Objective-C程序生成目标文件里的执行时信息怎样获取?对于一个OC的.m程序文件,在Terminal输入命令:gcc-frameworkFoundationmain.m-op1当然。执行命令即:./p1然后,通过otool工具获取目标文件(包含头部、载入指令、各个segment)中执行时信息(有专门的segment保存)otool-op1

PS我们能够通过获取执行时信息了解对象模型中元类对象和类对象结构等信息,例如以下所看到的。能够清晰看到类对象列表和元类映射关系,结构信息

THE END
1.消息机制第一阶段: 消息发送 第二阶段: 动态方法解析 第三阶段: 消息转发 将消息转发给别人去实现; 如果经历过以上3个阶段objc_msgSend 找不到合适的方法进行调用,会报错unrecognized selector sent to instance; 注:元类对象是一种特殊的类对象; 二、objc_msgSend底层实现: https://www.jianshu.com/p/099ce2e51305
2.面向对象的基本概念面向对象的基本概念有对象、类、抽象、封装、继承、多态、接口、消息、组件、模式和复用等。 1.对象 对象是由数据及其操作所构成的封装体,是系统中用来描述客观事物的一个封装,是构成系统的基本单位,采用计算机语言描述,对象是由一组属性和对这组属性进行操作的一组服务构成。 https://blog.csdn.net/faihung/article/details/76599778
3.java中kafka发消息返回结果kafka发消息写法一:发送的消息对象是字符串 1 创建项目 2 项目结构 3 application.yml 配置文件 4 生产者 KafkaProducerComponent 5 消费者 KafkaConsumerComponent 6 控制器(GET请求发送消息) 7 启动类 8 测试效果 写法二:发送复杂消息对象 1 创建项目 2 项目结构 https://blog.51cto.com/u_16213626/9284004
4.对象存储POST上传对象存储API文档用户除了可以用PUT直接上传对象外,还可以使用POST上传对象。 单次上传对象大小范围是[0, 5GB],如果需要上传超过5GB的大文件,需要通过多段操作来分段上传。 与PUT上传的区别 PUT上传中参数通过请求头域传递;POST上传则作为消息体中的表单域传递。 PUT上传需在URL中指定对象名;POST上传提交的URL为桶域名,无需指定对象https://ecloud.10086.cn/op-help-center/doc/article/64198
5.Java语言程序设计试卷6套A、可提供多种实现方法 B、清楚边界隐藏内部细节 C、分布性 D、有利于复杂对象管理 E、安全和可移植 F、消息驱动 3、Java语言的多态性可以体现在?(正确答案:ABCDF) A、函数的重载 B、不同数据类型之间的合理转换 C、抽象函数和抽象类 D、多个构造函数 E、多个父类 F、派生出不同子类 https://developer.aliyun.com/article/1431557
6.教你3步画好时序图,轻松掌握产品经理都在学的流程分析利器首先,选定要展开分析的用例或目标;接着,分析都有哪些对象、角色参与了实现过程;然后,将它们在实现目标过程中,彼此之间的交互动作,按照时间轴的顺序列出来。 再简单点,就是定目标、找对象、列消息三步走。 1、定目标 画时序图,与活动图一样,要指定某个用例,或目标展开。这些动态视图,是用来描述在静态视图(如用https://www.niaogebiji.com/article-78077-1.html
7.消息分类标准通知消息管理规则推送服务旅游出行类App 便捷生活类App 运动健康类App 音乐类App 游戏类App 摄影类App 版本更新说明 使用入门 开发准备 配置AppGallery Connect 集成HMS实时运动Bundle对象键值 基础能力支持的国家/地区 扩展能力支持的国家/地区 设备接入 说明 运动设备接入开发指南 运动设备接入 有氧健身器材接入 https://developer.huawei.com/consumer/cn/doc/HMSCore-Guides/message-classification-0000001149358835
8.面向对象数据模型中的基本概念,如对象消息类继承重载多态消息是对象之间相互请求或相互协作的唯一途径,一个对象必须通过向其他对象发送消息的形式使得其他对象提供各自所能实现的功能。在面向对象的数据模型中,消是对象之间唯一的通信形式,也就是外界能够引用对象操作及获取对象状态的唯一方式,消息分为公有和私有两类,属于同一个对象的消息,其中有些是可由其他对象https://zhidao.baidu.com/question/402910824616679605.html