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