V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
m15173576325
V2EX  ›  iOS

从事 iOS 研发 6 年的面经——希望对你们有所帮助

  •  
  •   m15173576325 · 2018-06-11 14:29:06 +08:00 · 2528 次点击
    这是一个创建于 2340 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言:

    今天和大家分享一下,我从事 iOS 开发 5 年的面试心得。大大小小参加过不下 30+公司的面试,其中不乏 BAT、TMD 等一线互联网公司,总结一下,发现大厂招聘都有一个共性。

    对技术的要求很全面,有些同学认为 iOS 掌握了基础的 UI、网络、内存、多线程等等就够了,其实要想更好的应付 iOS 的面试,这些是远远不够的。比如对 RunTime 底层实现机制、RunLoop 的用户态到核心态切换逻辑,设计模式、架构以及框架的考察,再比如,可能是让很多同学头疼的算法问题,然而算法问题是一线大厂的必考内容。所以我们需要学习和掌握的还有很多。

    在这里和大家分享下我总结的 iOS 技术知识体系,大致可以分为以下几个部分:

    一、UI 视图

    其中包括事件传递、视图响应、UI 布局、绘制、Tableview 重用机制的理解等基本技术点,也包括如离屏渲染、流式页面的性能优化、异步绘制、UI 渲染机制等偏底层技术的考察。

    二、Objective-C 语言

    其中包括如 KVO、KVC、分类、扩展、关联对象等系统实现原理和机制,以及 NSNotification、属性关键字等相关技术点的考察。

    三、Runtime

    可以说是中级以及以上工程师的必备技术要求,面试官往往会考察大家对对象、类对象、原类对象的理解、消息传递机制、消息转发流程、Method-Swizzling、ISA-swizzling、动态方法解析、动态添加方法等。

    四、内存管理

    可以说是高阶考点,也是难点,中高级及以上无法回避的问题。考察内容基本包括:weak 自动置 nil、ARC、MRC、自动释放池的实现原理、循环引用、引用计数管理思想等。

    五、Block

    iOS 当中非常重要的 OC 语言特性,自然也是面试常考点。其中包括截获变量特性、__Block 关键字、Block 的本质、Block 的内存管理和循环引用等。

    六、多线程

    面试高级考点。iOS 常见的多线程技术 NSOperation&NSOperationQueue、NSThread、以及快用烂了的 GCD ;那么面试过程当中,往往会结合实际代码考察同学们对多线程技术的掌握深度,包括对于常见锁的考察,如 NSLock、递归锁、自旋锁、条件锁等等。

    七、RunLoop

    相信很多同学知道 RunLoop 可以有事做事,没事休息?面试当中的考察可能要更深入些,RunLoop 为什么会有事做事没事休息,系统是怎样实现的。哈哈,是不是有难度了,再比如怎样实现一个常驻线程、RunLoop 和线程的关系是怎样的等等。

    八、网络

    其中包括 HTTP 相关的中间人攻击、HTTPS 的连接建立流程、对称加密、非对称加密、DNS 劫持、TCP 的滑动窗口协议、可靠传输是怎样保证的,以及 TCP 的慢启动特点,Session/Cookie 的区别等等,这些都是面试中高级岗位必考问题。

    九、设计模式

    其中包括常见的软件设计原则,责任链、适配器、桥接、命令、单例、策略模式等等,不要告诉我你只是看了几本书,面试官会让你结合实际业务场景,现场考察你对设计模式的运用和理解的。

    十、架构 /框架

    其中包括常见的如怎样设计图片缓存框架、网络框架,客户端的整体架构怎样实现,常见的解耦方式有哪些,多数同学都知道 OPENURL 是一种解耦方案,那依赖注入这种方式可能 iOS 的同学会感到陌生,这也是面试官期许的答案。

    十一、算法

    其中包括 BAT、TMD 经常考察的有序数组归并、链表反转、字符串反转、大数相加算法思想等等,这部分变化就很多了。

    十二、第三方

    常见的 AFNetworking、SDWebImageView、Reactive Cocoa、React Native 等

    大厂考察的深度也是令人眼前一亮的,下面列举几个高阶难点问题:

    1. UI 视图的事件传递机制是如何实现的?

    2. UI 绘制原理是怎样的?

    3. 请利用 TableView 的重用机制实现一个字母索引条。

    4. 什么是离屏渲染?

    5. 什么是 ARC? (可能有很多同学还不清楚 ARC 是编译器和 Runtime 的协作结果)

    6. AutoReleasePool 的实现机制。(总结一句话:是以栈为结点构成的双向链表结构。)

    7. 循环引用相关的考察,NSTimer 如果重复调用怎样解除循环引用?

    8. __block 关键字是否可以解决循环引用?

    9. Block 的本质是什么?

    10. Block 的截获变量的特性应该怎样解释,Block 是怎样产生循环引用的?

    11. 怎样利用 iOS 的多线程技术对共享变量实现多读单写操作呢?

    12. 怎样理解自旋锁? 递归锁应该怎样使用?

    13. 常见的线程同步问题该怎样解决?

    14. 怎样解决 DNS 劫持?

    15. TCP 的慢启动特点是怎样的。

    16. 你对 HTTPS 是怎样理解的?

    17.给你一个实际场景,让大家现场提出利用哪个设计模式解决实际问题。

    1. 怎样设计一个时长统计框架?

    19.怎样设计一个图片缓存框架?

    20.客户端的整体架构实现是怎样的,解耦方式都有哪些?

    21.UIView 和 CALayer 之间的关系是怎样的?请从设计原则的角度回答系统为何这样设计?

    22.UI 卡顿、掉帧的原理是怎样的?

    23.请解释一下你对 isa 指针的理解。

    24.你是怎样理解引用计数机制的?(很多人会说什么 retain\release\dealloc,完全没有 Get 到面试官的考察意图)

    以上 24 道面试题,同学们看看自己能回答出多少个?其实我想说有的时候你的答案在你理解是正确的,在面试官看来可能很肤浅(原谅我这么直白。。。) 希望此篇文章对你有帮助!

    作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的 iOS 交流群:714042473,不管你是小白还是大牛欢迎入驻 ,分享 BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!希望帮助开发者少走弯路。

    谢谢!

    znood
        1
    znood  
       2018-06-11 18:51:07 +08:00 via iPhone
    注册这么多号发广告,都 block 不完
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5356 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 42ms · UTC 05:55 · PVG 13:55 · LAX 21:55 · JFK 00:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.