Objective-C基础(一)
OC基础的面试考点会比较琐碎,但是内容不多,大部分记一记就OK啦。
什么是OC?Objective-C的简称,中文是面向对象的C语言,兼容C语言和C++,也就是可以在代码中任意嵌入C或者C++两种语言。
1. OC代码的编译过程
想必学过C/C++的同学都了解,C/C++的编译过程是先依靠编译器转换成汇编代码,在从汇编代码转换成可以在机器上跑的包含0和1的机器代码。过程为: C/C++ -> 汇编代码 -> 机器代码
而OC,其底层,其实就是C语言代码和C++代码,这一点从Objective-C这个命名上也可以大致看出。在编译时,会先转换成C/C++代码,然后再继续编译。接下来的过程和上面的过程就一模一样了,所以其编译过程为: OC -> C/C++ -> 汇编代码 -> 机器代码
2. OC和C++的区别
- C++支持多重继承,OC仅支持单继承
- C++是函数指针,OC是消息传递
- C++由编译期决定变量类型,OC在运行时确定
- C++由虚函数规定接口,OC用protocol
- C++支持方法重载,OC不允许两个函数拥有相同函数名
其中,2、3、5这几点都和Runtime相关,大家可以等讲到Runtime后再回过头来理解,这里可以先记下来,着重理解1和4。
3. App启动过程
- 装载App可执行文件,递归加载所有依赖库
- Runtime加载类并调用类的load方法,注册类、初始化类
- 调用main函数
第一步很好理解,运行App肯定要先有一个可执行文件,然后所使用的所有库文件,都得加载到内存来保证不会出现例如被调用的函数找不到等问题;
第二步是Runtime的工作,这里提到的Runtime和load方法,可以先不用去理解,先记下来,后面讲到Runtime的时候再回来理解。注册类、初始化类很好理解,就是把程序中所有类,注意不是指类的对象,是指类本身,加载到内存; 注意:类本身指的是用于描述这个类的数据(例如这个类有哪些属性,方法,协议),而类的对象指的是用于描述类对象的数据(例如这个对象的属性的值)
第三步,和C、C++、JAVA这些语言一样,OC也有一个入口函数,main函数,调用它之后,程序就开始执行了。
4. static变量在什么时候确定值
我们在OC中可能会写下面这样的代码:
static NSString *axiom1 = @"生存是文明的第一需要";
那么这个static修饰的变量,是在编译期就确定其值,还是可以等到在程序运行期间,通过在CPU上做一些计算,来得到值呢?
答案是static变量在编译阶段确定值,所以它必须用如上方式,用字面量来初始化,不能用函数来给它初始化。
什么是字面量?可以这么简单理解,我们在代码中直接写出的值或者字符串,就可以称之为字面量。例如直接在代码中写1,或者3.14,或者@"生存是文明的第一需要",这些都是字面量,就是从字面上,就知道其值的量。可以与对比x和y这种变量的区别来理解其含义。
下面举几个例子:
static float x = 1 + 3.14; // 对,因为1和3.14都是字面量 static int y = returnOne(); // 假设returnOne返回一个int型1,错,因为函数需要等到程序运行期间才能计算其值
5. 悬垂指针/野指针
悬垂指针:指针指向的内存已经释放,但指针还在
野指针:没有被初始化的指针
悬垂指针就是说假设我们有一个指针ptr,指向某一块内存区域,而在程序运行过程中,这块内存区域被释放掉了,那么之前那个指针ptr,就变成了一个悬垂指针,如果我们仍然尝试访问它,那么程序肯定就会出问题啦。
野指针就是我们在定义一个指针时,并没有初始化其指向的内存区域,在某些语言中,未初始化的指针可能会被编译期赋值为任意一个值,那么它就可能指向内存中的任意一块区域,这是很危险的。所以在上学时,相信我们的老师都教过我们在定义指针时,如果不确定要将其指向哪里,要记得先将它定义为空指针(nullptr)。在OC中也是如此,我们可以先将其赋值为nil,这是一个良好的编程习惯。不过现在OC的编译器会自动把这些未初始化的指针赋值为nil,所以大家如果有些时候不记得也不用担心~
好啦!感谢您读到这里。
下期再聊 :)
个人公众号:iOS开发学习
==未经作者允许,禁止转载!==
#iOS开发工程师##iOS开发工程师实习生##iOS工程师##iOS开发实习生##学习秋招#学习iOS开发 == 手握大厂offer