iOS高级开发者面试必过技巧

前言

本文就是笔者认为能够用来面试高级 iOS 程序员的面试题。这套题的题目跟公司和业务都没有关系,并且也并不表明本人能够把这些题回答得很是好,只是将一部分以为比较好的题从收集的面试题里面抽出来了而已。程序员

本文分为两个部分展开:
面试题
喜欢考察的和不喜欢考察的题
第一部分就是面试题了;第二部分给出了笔者喜欢考察和不喜欢考察的题以及缘由。面试

面试题

iOS 基础题算法

1.分类和扩展有什么区别?能够分别用来作什么?分类有哪些局限性?分类的结构体里面有哪些成员?
2.讲一下atomic的实现机制;为何不能保证绝对的线程安全(最好能够结合场景来讲)?
3.被weak修饰的对象在被释放的时候会发生什么?是如何实现的?知道sideTable么?里面的结构能够画出来么?
4.关联对象有什么应用,系统如何管理关联对象?其被释放的时候须要手动将其指针置空么?
5.KVO的底层实现?如何取消系统默认的KVO并手动触发(给KVO的触发设定条件:改变的值符合某个条件时再触发KVO)?
6.Autoreleasepool所使用的数据结构是什么?AutoreleasePoolPage结构体了解么?
7.讲一下对象,类对象,元类,跟元类结构体的组成以及他们是如何相关联的?为何对象方法没有保存的对象结构体里,而是保存在类对象的结构体里?
8.class_ro_t 和 class_rw_t 的区别?
9.iOS 中内省的几个方法?class方法和objc_getClass方法有什么区别?
10.在运行时建立类的方法objc_allocateClassPair的方法名尾部为何是pair(成对的意思)?
11.一个int变量被__block修饰与否的区别?
12.为何在block外部使用__weak修饰的同时须要在内部使用__strong修饰?
13.RunLoop的做用是什么?它的内部工做机制了解么?(最好结合线程和内存管理来讲)
14.哪些场景能够触发离屏渲染?(知道多少说多少)编程

iOS 实战题设计模式

1.AppDelegate如何瘦身?
2.反射是什么?能够举出几个应用场景么?(知道多少说多少)
3.有哪些场景是NSOperation比GCD更容易实现的?(或是NSOperation优于GCD的几点,知道多少说多少)
4.App 启动优化策略?最好结合启动流程来讲(main()函数的执行先后都分别说一下,知道多少说多少)
5.App 无痕埋点的思路了解么?你认为理想的无痕埋点系统应该具有哪些特色?(知道多少说多少)
6.你知道有哪些状况会致使app崩溃,分别能够用什么方法拦截并化解?(知道多少说多少)
7.你知道有哪些状况会致使app卡顿,分别能够用什么方法来避免?(知道多少说多少)数组

网络题安全

1.App 网络层有哪些优化策略?
2.TCP为何要三次握手,四次挥手?
3.对称加密和非对称加密的区别?分别有哪些算法的实现?
4.HTTPS的握手流程?为何密钥的传递须要使用非对称加密?双向认证了解么?
5.HTTPS是如何实现验证身份和验证完整性的?
6.如何用Charles抓HTTPS的包?其中原理和流程是什么?
7.什么是中间人攻击?如何避免?网络

计算机系统题数据结构

1.了解编译的过程么?分为哪几个步骤?
2.静态连接了解么?静态库和动态库的区别?
3.内存的几大区域,各自的职能分别是什么?
4.static和const有什么区别?
5.了解内联函数么?
6.何时会出现死锁?如何避免?
7.说一说你对线程安全的理解?
8.列举你知道的线程同步策略?
9.有哪几种锁?各自的原理?它们之间的区别是什么?最好能够结合使用场景来讲架构

设计模式题

1.除了单例,观察者设计模式之外,还知道哪些设计模式?分别介绍一下
2.最喜欢哪一个设计模式?为何?
3.iOS SDK 里面有哪些设计模式的实践?
4.设计模式是为了解决什么问题的?
5.设计模式的成员构成以及工做机制是什么?
6.设计模式的优缺点是什么?

架构 & 设计题

1.MVC和MVVM的区别?MVVM和MVP的区别?
2.面向对象的几个设计原则了解么?最好能够结合场景来讲。
3.能够说几个重构的技巧么?你以为重构适合何时来作?
4.你以为框架和设计模式的区别是什么?
5.看过哪些第三方框架的源码,它们是怎么设计的?设计好的地方在哪里,很差的地方在哪里,如何改进?(这道题的后三个问题的难度已经很高了,若是不是太N的公司不建议深究)

数据结构&算法题

1.链表和数组的区别是什么?插入和查询的时间复杂度分别是多少?
2.哈希表是如何实现的?如何解决地址冲突?
3.排序题:冒泡排序,选择排序,插入排序,快速排序(二路,三路)能写出那些?
4.链表题:如何检测链表中是否有环?如何删除链表中等于某个值的全部节点?
5.数组题:如何在有序数组中找出和等于给定值的两个元素?如何合并两个有序的数组以后保持有序?
6.二叉树题:如何反转二叉树?如何验证两个二叉树是彻底相等的?

喜欢出的和不喜欢出的题

不难看出,整套面试题中的iOS部分占比其实并不大(三分之一),由于笔者认为:

高级 iOS 开发 = 高级开发 + (高级) iOS 开发。

而其中高级开发的部分应该做为优先考核的内容,目的在于首先要验证面试者是否具有高级开发必备的基本素质。这部分知识的掌握程度会直接影响一个开发者的研究和设计能力,包括横向和纵向的。而笔者我的以为后面的(高级) iOS 开发的部分仅仅考查的是面试者对于 iOS 自己的理解程度(API,系统,开发工具等等)。

在这套里面,我的最喜欢的几道题是:

1.iOS SDK 里面有哪些设计模式的实践?
2.说一说你对线程安全的理解?
3.你知道有哪些状况会致使app崩溃,分别能够用什么方法拦截并化解?
4.看过哪些第三方框架的源码,它们是怎么设计的?
5.能够说几个重构的技巧么?你以为重构适合何时来作?

  1. 这道题一举两得,不只考察了面试者对设计模式这种通用性知识的了解,还能够考察其对iOS SDK的熟悉和思考程度。这里能够简单提几个:单例:UIApplication;观察者模式:KVO;类簇:NSNumber;装饰者模式:分类;命令模式:NSInvocation;享元模式:UITableviewCell(UITableview的重用)。还有更多,有兴趣的读者能够看一下《Objective-C 编程之道》这本书,它介绍了不少在 iOS SDK中使用的设计模式。

  2. 这道题我看到网上有些答案是错的,说的大概的意思是“同一时刻只有一个线程访问”。可是若是按照这个定义的话,那么那些没法改变的常量就不算是线程安全的了,因此显然这类定义就是错的。因此说学东西要具有批判性思惟,尤为是看博客的时候,不少状况须要本身想一想,主动去认证,去思考。

  3. 致使app崩溃的缘由有不少,好比向某个对象发送其没法响应的方法,数组越界,集合类中添加nil对象,string访问越界,KVO不合理的移除关联key(KVO致使的崩溃不只仅这一种缘由)等。而崩溃很是影响用户体验,因此笔者认为一名高级 iOS 开发应该具有避免这些崩溃的能力,起码至少也要知道这些容易致使崩溃的场景。

  4. 看一些优秀开源框架的代码,梳理实现思路和细节能够帮助咱们提升在相似场景下设计系统的能力。其实道理很简单,小时候学习写做文的办法是什么?- 就是背诵课文而已啊。由于写做是一种输出,因此若是你没有好词好句的积累(输入),天然写不出辞藻丰富的文章。写代码也是同样的道理~

  5. 重构的能力是笔者很是看重的能力。其实笔者我的认为关于重构的技巧能够早早学习,在后面写代码的时候尽量作到一步到位(若是在排期容许的状况下),并且也对设计代码方面能力的提升有帮助:怎样才能设计出一个低耦合,高内聚,易扩展,易修改的系统?有专门的一本书来介绍重构:《重构 改善既有代码的设计》。

上面说了笔者喜欢考察的问题,下面说一下笔者不喜欢考察的是哪些问题:

1.如何查询线上的崩溃?
2.了解发布流程么?几个证书的区别?
3.有没有作过支付/地图/分享?
4.dysm文件是什么,有什么做用?

笔者不考察这类问题的缘由有两个:

1.这类问题考查不了面试者做为一名程序员的基本素质,由于其考察的内容仅仅局限于iOS自己。
2.这类问题每每是“作过即知道”,更没办法量化能力。在实际开发中遇到了就作过了;就算没遇到,没作过,笔者也相信一名优秀的程序员在第一次也会高效地作好。

这套题就分享到这里了,若是有疑问,而且须要更加详细的面试题详解,能够加iOS技术群:624212887 共同交流,谢谢你们的支持。

相关文章
相关标签/搜索