Objective-C 底层数据类型分析(一)

来源:互联网 发布:python数组最大值下标 编辑:程序博客网 时间:2024/05/17 22:19

写了这么多OC代码,对OC的底层实现还是理解不透,遇到一些疑惑还是无法解释为什么是那样,要理解OC的底层实现,首先需要对OC底层使用的数据类型有一定的了解,下面逐一分析。

声明:需要对C语言的数据结构有些了解才能更好的理解下面的内容。

一、类 Class

Class是OC中的一种数据类型,进入系统头文件objc/objc.h,可以看到Class实际上是一个typedef之后的结构体指针,如下,

// An opaque type that represents an Objective-C class.typedef struct objc_class *Class;

那么结构体 struct objc_class 内部包含哪些成员变量呢?再进入objc/runtime.h ,内部结构如下

struct objc_class {        Class isa; // 指向metaclass(metaclass 后面解释)         Class super_class ;   // 指向其父类        const char *name ;    // 类名        long version ;    // 类的版本信息,初始化默认为0,可以通过runtime函数class_setVersion和class_getVersion进行修改、读取        long info;   // 一些标识信息,如CLS_CLASS (0x1L) 表示该类为普通 class ,其中包含对象方法和成员变量;CLS_META (0x2L) 表示该类为 metaclass,其中包含类方法;        long instance_size ;   // 该类的实例变量大小(包括从父类继承下来的实例变量);        struct objc_ivar_list *ivars;   // 是一个结构体指针,指向第一个成员变量的,通过ivars可以访问所有的成员变量        struct objc_method_list **methodLists ;   // 存储类的方法的地址        struct objc_cache *cache;   // 指向最近使用的方法的指针,用于提升效率;        struct objc_protocol_list *protocols;   // 存储该类遵守的协议 } /* Use `Class` instead of `struct objc_class */ 

可以看出,Class本质上是一个结构体,保存着类的各种信息。

二、对象

1)先了解一下最纯洁,最基本的类,NSObject,进入objc/object.h里面可以看到如下

@interface NSObject <NSObject> {    Class isa  OBJC_ISA_AVAILABILITY;}
NSObject类只有一个成员变量。isa指针,这个指针就是指向上面所讲的struct objc_class 结构体,isa指针占8个字节的内存空间。

2)自定义类的结构

定义一个Person类

@interface Person : NSObject@property (nonatomic, copy) NSString *name;@property (nonatomic, assign) double weight;@property (nonatomic, assign) double height;@end

创建一个Person对象

    Person *person = [[Person alloc] init];    person.name = @"haha";    person.weight = 50.9;    person.height = 170;        NSLog(@"==Person===%@", person);

在Console中输入p *person,可以看到Xcode输出一下内容

可以看出person实例有四个成员变量,第一为isa指针,继承自NSObject;其他三个位自己独有的成员变量。isa指向Person类,平时通过 [Person Class]得到的就是isa指针。

0 0