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++的区别

  1. C++支持多重继承,OC仅支持单继承
  2. C++是函数指针,OC是消息传递
  3. C++由编译期决定变量类型,OC在运行时确定
  4. C++由虚函数规定接口,OC用protocol
  5. C++支持方法重载,OC不允许两个函数拥有相同函数名

其中,2、3、5这几点都和Runtime相关,大家可以等讲到Runtime后再回过头来理解,这里可以先记下来,着重理解1和4。

3. App启动过程

  1. 装载App可执行文件,递归加载所有依赖库
  2. Runtime加载类并调用类的load方法,注册类、初始化类
  3. 调用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开发学习 文章被收录于专栏

学习iOS开发 == 手握大厂offer

全部评论

相关推荐

牛客5655:其他公司的面试(事)吗
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务