今天一共面了四家公司,都是面试iOS岗的。今天就说一下面试的问题吧,也算是给自己回顾一下。答案也是我自己的了解跟一些资料结合的,不敢保证百分百就是对的。
第一家:
1.id跟isa是什么,简单说一下?
我:id是可以指向任何一个对象的指针,算是个泛指针。isa平常好像没用到。
答案:id是一个指向某个类的实例的指针,id是一种通用的对象类型,可以用来存储任何类型的对象。也可以理解为“万能指针”。isa是Objeect-C的一个隐藏的数据结构,每个Objeect-C都有,是Objeect-C对象的第一个成员变量,它指向的是该对象的类(class)。
2.深浅拷贝?
浅拷贝:指针拷贝,复制一个新的指针,指向的是同一个内存地址,实际的内存没有发生拷贝。
深拷贝:内容拷贝,拷贝数据到一块新的内存地址,指针指向拷贝的新的内存地址。
对于不可变类型NSString:copy是浅拷贝,mutableCopy是深拷贝;nutableCopy之后变成了NSMutableString。
对于可变变量NSMutableString:copy和mutableCopy都是深拷贝,但是copy之后的数据类型变成了NSString。
结论:copy之后是不可变的,mutableCopy之后是可变的。
3.父类继承问题:子类继承自父类,但是没有写自己的初始化方法,当调用子类初始化的时候返回的时候对象?
答:因为子类没有重写自己的初始化方法,所以该子类进行初始化的时候用的是父类的初始化方法,则返回的对象是父类的对象,那这个子类继承自父类就没有意义了。
4.nil跟NSnull的区别
答:nil:但初始化一个OC对象为空的时候可以赋值为nil
NSnull:NSNull只有一个方法:+ (NSNull *) null;[NSNull null]用来在NSArray和NSDictionary中加入非nil(表示列表结束)的空值. [NSNull null]是一个对象,他用在不能使用nil的场合。
举例:NSnull就是一个空指针,比如说想要在数组中间添加一个空元素就可是使用它。
5:问二叉树的结果是什么样的,有哪种遍历方式?
二叉树的形态就是一个树形结构,有一个根节点,节点下面有子节点,最底层的节点为叶子节点。子节点最多有两个。像一个金字塔型,跟堆对的结构差不多。遍历的方式有前中后序遍历三种方式。
6.你对红黑树的理解?
这个真的问到我了,学数据结构的时候就是简单的看了一下,我就是实话实话了。
答:
7.冒泡排序跟选择排序的思路?
这个是最简单的了。
答:冒泡排序就是两层循环结构,里面一个if判断大小进行交换,两层循环结束就代表这个数值有序了。
选择排序:每次循环找到一个最小或者最大的值,将它提到最前面,遍历结束就是有序的了。
具体代码我是真的好久没有写了。
到这第一家结束了,我问了一些公司福利,直接表明我的期望工资。
第二家:
1.你知道的设计模式有哪些?
代理模式,MVC模式,单例模式,工厂模式。
代理模式:
应用场景:当一个类的某些功能需要由别的类来实现,但是又不确定具体会是哪个类实现。
MVC模式:
应用场景:是一中非常古老的设计模式,通过数据模型,控制器逻辑,视图展示将应用程序进行逻辑划分。
单例模式:
应用场景:确保程序运行期某个类,只有一份实例,用于进行资源共享控制。
工厂模式:
应用场景:工厂方式创建类的实例,多与proxy模式配合,创建可替换代理类。
2.用什么实现数据持久化?
有四种方式:
属性列表(plist)、数据归档(NSKeyedValueArchiver/NSUserDefaults)、数据库(sqlite)和coreData等
3.单例模式如何运用?
在整个程序中只有一个实例,并且提供一个类方法供全局调用,在编译时初始化这个类,然后一直保存在内存中,到程序(APP)退出时由系统自动释放这部分内存。
在整个应用程序中,共享一份资源(这份资源只需要创建初始化1次),一般用于工具类。例如:登陆控制器,网络数据请求,音乐播放器等一个工程需要使用多次的控制器或方法。
4.用过哪些数据库,如何获取数据库的数据?
宏观的话就是这样
①客户端(用户)向服务器发送请求
②服务器收到请求后,通过sql语言与服务器上运行的服务端(也就是数据库)的数据库管理系统(DBMS)通信得到数据
③查询得到结果再返还给客户端
5.HTTP跟HTTPS的区别?
HTTP 协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息。默认http协议的端口为80,用户访问网站 http://。
HTTPS协议是HTTP经过SSL/TLS加密数据包的,安全性更高,HTTPS 默认工作在 TCP 协议443端口。HTTPS工作流程中就有哪个必问的三次握手。
6.TCP的三次握手
第一次握手:客户端向服务器端发送数据请求连接SYN,
第二次握手:如果服务器端接收到客户端的请求连接,则服务器端知道客户端的发送功能正常。然后发送响应请求,
第三次握手,如果客户端接收到服务器端的响应请求,则客户端知道服务器的读写功能正常,能够接收和发送数据,然后响服务器端发送确认包,这时也可发送些数据。完成三次握手。
7.问了有没有用过第三方库
第三家:
1.block是什么,使用block会遇到什么问题?
block本质是一个结构体,也算是一个函数,一般用于数据回调,block如果都是强持有的话容易出现循环引用的问题,可以week一方跳出循环。
2.有没有过马甲包打包提包?
没有试过自己打包,但是有提过包两次,一次成功了一次没有。
3.runloop跟runtime
runtime即运行时,它是一套比较底层的纯C语言API,属于一个C语言库,包含了许多C语言的API,它是OC的幕后工作者,我们平时写的OC代码在运行过程中都会转为runtime的C语言代码。就是系统在运行的时候的一些机制,最主要的是消息机制。意味着它可以动态创建类和对象
,进行消息发送和转发
等操作。
runloop运行循环
的意思,具体查看RunLoop官方文档,主要作用就是保证线程不退出能随时处理事件,实现了线程有工作时忙,没工作时线程进入睡眠,避免资源浪费的目的。
第四家:
一家大厂,想让去北京我没意向。面试也没问什么,我就简单描述一下,问了下我平常怎么学习的,有没有看博客的习惯,runloop跟runtime也问了。让我现场写一个插入排序。这我自己都傻逼了,太久没用算法了,知道逻辑是怎么一回事,但是就是写不出来结构。这一点真不行,我还得重新养成刷力扣得习惯吧,Java也都快忘没了,我觉得这是我目前不太好得地方。
总结:技术方面得知识我还是差的多,还得是多学学,多用用平常没有怎么接触过得控件。学一下app得开发,真的得抽时间时间学习了,大四仔。