一、Objective-C的本质
1、OC的本质
OC代码的底层实现其实都是C/C++代码,编译器先把OC代码转换成C/C++代码,接着转成汇编语言,最后转成机器语言最终运行在手机上;所以OC代码的本质其实就是C/C++代码;
OC对象转换过程
2、Objective-C的对象、类主要是基于C/C++的什么数据结构实现的?
Objective-C的面向对象都是基于C/C++的数据结构实现的
3、手动将Objective-C代码转换成C/C++代码
- 打开终端,找到要转成C++代码的源文件所在目录,如:main.m
- 在终端输入命令
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc main.m -o main.cppxcrun -sdk iphonesimulator clang -arch i386 -rewrite-objc main.m -o main.cpp
其中:main.m是要编译的文件(带后缀名)main.cpp是要生成的C++文件;
- mac环境下文件编译命令:
clang -rewrite-objc main.m -o main.cpp
二、OC对象的分类
1.instance对象(实例对象)
2.class对象(类对象)
3.meta-class对象(元类对象)
1、instance(实例对象)
instance对象就是通过类alloc
出来的对象,每次调用alloc
都会产生新的instance对象;
instance对象在内存中存储着信息包括:
- isa指针
-
其他成员变量的具体值
instance在内存中存储信息
OC对象在内存中是如何布局的:
-
OC对象在内存中其实就是一个结构体,系统会在堆中开辟一块内存空间存放该对象,这块空间里还包含成员变量和isa(struct objc_class)指针,isa的地址就相当于是结构体的地址;然后栈里的局部变量指向这块存储空间的地址;
OC 对象的内存布局
2、class(类对象)
使用class出来的对象(类对象)
每个类在内存中有且只有一个class对象
注意:class方法返回的一直是类对象,所以哪怕这样写还是会返回类对象
Class objectMetaClass2 = [[[NSObject class] class] class];
class对象在内存中存储的信息
- isa指针
- superclass指针
- 类的属性信息(@property)、类的对象方法信息(instance method)
- 类的协议信息(protocol)、类的成员变量信息(ivar)
-
......
class在内存中存储信息
3、meta-class(元类对象)
objectMetaClass是NSObject的meta-class对象(元类对象),每个类在内存中有且只有一个meta-class对象
Class objectMetaClass = object_getClass(objectClass5);
meta-class对象和class对象的内存结构是一样的,但是用途不一样,在内存中存储的信息主要包括
- isa指针
- superclass指针
- 类的类方法信息(class method)
- ......
meta-class在内存中存储信息
isa指针的指向 - instance的isa指向class
当调用对象方法时,通过instance对象的isa指针找到class,最后找到对象方法的实现进行调用。 - class的isa指针指向meta-class
当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用。
class对象的superclass指针
- 当Student的instance对象要调用Person的对象方法时,会先通过isa找到Student的superclass,然后通过superclass找到Person的class,最后找到对象方法的实现进行调用
meta-class对象的superclass指针
- 当Student的class要调用Person的类方法时,会先通过isa找到Student的meta-class,然后通过superclass找到person的meta-class,最后找到类方法的实现进行调用。
isa、superclass的总结
- instance的isa指向class
- class的isa指向meta-class
- meta-class的isa指向基类的meta-class
- class的superclass指向父类的class;如果没有父类,superclass的指针为nil
- meta-class的superclass指向父类的meta-class;基类的meta-class的superclass指向基类的class
- instance调用对象方法的轨迹;isa找到class,方法不存在,就通过superclass找父类
- class调用类方法的轨迹;isa找meta-class,方法不存在,就通过superclass找父类
转载自|简书
网友评论