目录
1、iOS 基础题
2、iOS 实战题
3、网络题
4、计算机系统题
5、设计模式题
6、架构 & 设计题
7、数据结构&算法题
大小厂基础面试篇:
小编这里有准备一些面试进阶资料,最新面试大厂常问面试答案一份。希望真心能够帮助到大家提升技术!
1,分类和扩展有什么区别?可以分别用来做什么?分类有哪些局限性?分类的结构体里面有哪些成员?
2,讲一下atomic的实现机制;为什么不能保证绝对的线程安全(最好可以结合场景来说)?
3,被weak修饰的对象在被释放的时候会发生什么?是如何实现的?知道sideTable么?里面的结构可以画出来么?
4,Autoreleasepool 所使用的数据结构是什么? AutoreleasePoolPage 结构体了解么?
5,讲一下对象,类对象,元类,跟元类结构体的组成以及他们是如何相关联的?为什么对象方法没有保存的对象结构体里,而是保存在类对象的结构体里?
6,iOS 中内省的几个方法? class 方法和 objc_getClass 方法有什么区别?
7,RunLoop的作用是什么?它的内部工作机制了解么?(最好结合线程和内存管理来说)
8,哪些场景可以触发离屏渲染?(知道多少说多少)
2、iOS 实战题
1,有哪些场景是NSOperation比GCD更容易实现的?(或是NSOperation优于GCD的几点,知道多少说多少)
2,App 启动优化策略?最好结合启动流程来说(main()函数的执行前后都分别说一下,知道多少说多少)
3,App 无痕埋点的思路了解么?你认为理想的无痕埋点系统应该具备哪些特点?(知道多少说多少)
4,你知道有哪些情况会导致app崩溃,分别可以用什么方法拦截并化解?(知道多少说多少)
5,你知道有哪些情况会导致app卡顿,分别可以用什么方法来避免?(知道多少说多少)
3、网络题
1,App 网络层有哪些优化策略?
2,TCP为什么要三次握手,四次挥手?
3,HTTPS的握手流程?为什么密钥的传递需要使用非对称加密?双向认证了解么?
4,HTTPS是如何实现验证身份和验证完整性的?
5,如何用Charles抓HTTPS的包?其中原理和流程是什么?
4、计算机系统题
1,了解编译的过程么?分为哪几个步骤?
2,静态链接了解么?静态库和动态库的区别?
3,static和const有什么区别?
4,什么时候会出现死锁?如何避免?
5,有哪几种锁?各自的原理?它们之间的区别是什么?最好可以结合使用场景来说
5、设计模式题
1,除了单例,观察者设计模式以外,还知道哪些设计模式?分别介绍一下
2,iOS SDK 里面有哪些设计模式的实践?
3,设计模式的成员构成以及工作机制是什么?
6、架构 & 设计题
1,MVC和MVVM的区别?MVVM和MVP的区别?
2,面向对象的几个设计原则了解么?最好可以结合场景来说。
3,可以说几个重构的技巧么?你觉得重构适合什么时候来做?
4,你觉得框架和设计模式的区别是什么?
5,看过哪些第三方框架的源码,它们是怎么设计的?设计好的地方在哪里,不好的地方在哪里,如何改进?(这道题的后三个问题的难度已经很高了,如果不是太N的公司不建议深究)
7、数据结构&算法题
1,链表和数组的区别是什么?插入和查询的时间复杂度分别是多少?
2,哈希表是如何实现的?如何解决地址冲突?
3,排序题:冒泡排序,选择排序,插入排序,快速排序(二路,三路)能写出那些?
4,链表题:如何检测链表中是否有环?如何删除链表中等于某个值的所有节点?
5,数组题:如何在有序数组中找出和等于给定值的两个元素?如何合并两个有序的数组之后保持有序?
6,二叉树题:如何反转二叉树?如何验证两个二叉树是完全相等的?
大厂高级面试篇:
1、NSArray与NSSet的区别?
- NSArray内存中存储地址连续,而NSSet不连续
- NSSet效率高,内部使用hash查找;NSArray查找需要遍历
- NSSet通过anyObject访问元素,NSArray通过下标访问
2、NSHashTable与NSMapTable?
- NSHashTable是NSSet的通用版本,对元素弱引用,可变类型;可以在访问成员时copy
- NSMapTable是NSDictionary的通用版本,对元素弱引用,可变类型;可以在访问成员时copy
(注:NSHashTable与NSSet的区别:NSHashTable可以通过option设置元素弱引用/copyin,只有可变类型。但是添加对象的时候NSHashTable耗费时间是NSSet的两倍。
NSMapTable与NSDictionary的区别:同上)
3、属性关键字assign、retain、weak、copy
- assign:用于基本数据类型和结构体。如果修饰对象的话,当销毁时,属性值不会自动置nil,可能造成野指针。
- weak:对象引用计数为0时,属性值也会自动置nil
- retain:强引用类型,ARC下相当于strong,但block不能用retain修饰,因为等同于assign不安全。
- strong:强引用类型,修饰block时相当于copy。
4、weak属性如何自动置nil的?
- Runtime会对weak属性进行内存布局,构建hash表:以weak属性对象内存地址为key,weak属性值(weak自身地址)为value。当对象引用计数为0 dealloc时,会将weak属性值自动置nil。
5、Block的循环引用、内部修改外部变量、三种block
- block强引用self,self强引用block
- 内部修改外部变量:block不允许修改外部变量的值,这里的外部变量指的是栈中指针的内存地址。__block的作用是只要观察到变量被block使用,就将外部变量在栈中的内存地址放到堆中。
- 三种block:NSGlobalBlack(全局)、NSStackBlock(栈block)、NSMallocBlock(堆block)
6、KVO底层实现原理?手动触发KVO?swift如何实现KVO?
- KVO原理:当观察一个对象时,runtime会动态创建继承自该对象的类,并重写被观察对象的setter方法,重写的setter方法会负责在调用原setter方法前后通知所有观察对象值得更改,最后会把该对象的isa指针指向这个创建的子类,对象就变成子类的实例。
- 如何手动触发KVO:在setter方法里,手动实现NSObject两个方法:willChangeValueForKey、didChangeValueForKey
- swift的kvo:继承自NSObject的类,或者直接willset/didset实现。
7、categroy为什么不能添加属性?怎么实现添加?与Extension的区别?category覆盖原类方法?多个category调用顺序
- Runtime初始化时categroy的内存布局已经确定,没有ivar,所以默认不能添加属性。
- 使用runtime的关联对象,并重写setter和getter方法。
- Extenstion编译期创建,可以添加成员变量ivar,一般用作隐藏类的信息。必须要有类的源码才可以添加,如NSString就不能创建Extension。
- category方法会在runtime初始化的时候copy到原来前面,调用分类方法的时候直接返回,不再调用原类。如何保持原类也调用(https://www.jianshu.com/p/40e28c9f9da5)。
- 多个category的调用顺序按照:Build Phases ->Complie Source 中的编译顺序。
小编推荐文章阅读:新2020iOS面试和答案(不断更新中)
这里最新面试大厂常问面试答案一份。希望真心能够帮助到大家提升技术!
结语
iOS面试中刷题只是一方面准备,但是,好的面试机会,离不开技术的支持,在找工作的同时,不要忘记提升自身技术,希望求职中的iOS开发者,找到一份自己满意的工作!