这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战编程
在OC面向对象编程中,咱们天天都面对着建立对象,操做对象,那对象到底是什么?实例化的对象和类的本质又是什么?markdown
打开#import<objc/objc.h>
文件数据结构
/// An opaque type that represents an Objective-C class.
//一个不透明类型用于表示Objective-C类
typedef struct objc_class *Class;
/// Represents an instance of a class.
//表示类的实例
struct objc_object {
Class _Nonnull isa OBJC_ISA_AVAILABILITY;
};
/// A pointer to an instance of a class.
typedef struct objc_object *id;
复制代码
能够看出,OC中的类(Class
)编译后在C++中是以 struct objc_class
呈现的,咱们众所周知的NSObject
类编译后在C++中是一个struct objc_object
,里面只有一个成员变量,即Class类型的变量isa
。 在这里,咱们也明白了为何OC中的大部分对象了能够用id接收,由于id自己就是一个objc_object类型的结构体指针
。 那么objc_object和objc_class是什么关系呢?其实咱们自定义(继承于NSObject)的类,编译成C++对应的就是objc_class。 疑问:为何isa的类型是Class?其根本缘由是因为isa对外反馈的是类信息,为了让开发人员更加清晰明确,须要在isa返回时作了一个类型强制转换
。post
结构体是指把不一样的数据组合成一个总体,其变量是共存的,变量无论是否使用,都会分配内存。spa
缺点:全部属性都分配内存,比较浪费内存。假设有4个int成员,一共分配了16字节的内存,可是在使用时,你只使用了4个字节,剩余的12字节就是属于内存的浪费。指针
优势:存储容量较大,包容性强,且成员之间不会相互影响code
联合体也是由不一样的数据类型组成,但其变量时互斥的,全部成语攻占一段内存。并且共用体采用了内存覆盖技术,同一时刻只能保存一个成员的值,若是对新的成员赋值,就会将原来成员的值覆盖掉。orm
缺点:包容性弱。对象
优势:全部成员共用一段内存,使内存的使用更为精细灵活,同时也节省了内存空间。继承
有些信息在存储时,并不须要占用一个完整的字节,而只需占几个或一个二进制位。例如在存放一个开关量时,只有0和1两种状态,用1位二进制位便可。为了节省存储空间,并使处理简单,C语言又提供了一种数据结构,称为“位域”或“位段”。 所谓“位域”是把一个字节中的二进位划分为几个不一样的区域,并说明每一个区域的位数。每一个域有一个域名,容许在程序中按域名进行操做。这样就能够把几个不一样对象用同一个字节的二进制位域来表示。
对象本质:
位域:
联合体: