让 BAT 的 Offer 再也不难拿

随着各大公司春招的开始,不少小伙伴都行动起来了,我有幸可以加入百度并和你们分享本身的经验心得。因为我面试的都是比较大的公司,因此天然也是作了这方面的准备,所以这篇总结并不必定适合想去创业公司的同窗。另外,因为经验原本就是主观性极强的东西,加之笔者水平有限,因此若是有不承认的地方,万望诸君呵呵一笑,抛之脑后。php

接下来,我就斗胆分享一下本身在准备和参加面试的过程当中的收获、对面试的思考,以及一些可能对你们有用的建议。最后附赠一份大礼包,但愿能帮助每位读者找到本身心仪的工做。html


 

什么是面试

有些人可能会把面试看的过重,以为面试过了就能进入大厂,技术和财富兼得……node

我却是以为,面试没有这么夸张(抱歉作了一回标题党),它实际上是一次你和面试官互相了解的绝佳机会,借此机会你还能够对将来的工做有初步的了解。ios

面试自己并不能彻底评价一人个的实力。面试经过的人,也许只是刚好在面试时遇到了本身熟悉的问题,面试不经过,也有多是面试官自身的问题,并不是每一个面试官都具有客观评价别人的能力。git

换句话说,面试没经过也许是面试官没有发现你的才华,面试经过了也并不表明你就能胜任工做,由于进入企业以后可不是天天负责回答面试题!程序员

因此从这一点来看,面试有点像相亲。你满意我,我满意你,王八对绿豆——看上眼了,那就一拍即合,不然就分道扬镳。我本人很是但愿可以多几轮面试(实际并不老是能作到),这样你们都有充足的时间互相了解,决定去留。github

网上某些面经中,介绍了一些“装逼”的方法,还有所谓的“面试技巧”,我是不太承认的。技巧须要有,这是为了让你更好的展现本身,而非坑蒙拐骗,无理取闹,无中生有。我更想展示一个真实的本身,若是面试官不承认,说明咱们没有缘分,或者说本身的能力还不够。面试

面试要准备什么

有一位小伙伴面试阿里被拒后,面试官给出了这样的评价:“……计算机基础,以及编程基础能力上都有所欠缺……”。但这种笼统的回答并不是是咱们但愿的答案,所谓的基础到底指的是什么?正则表达式

做为一名 iOS 开发者,我所理解的基础是 操做系统、网络和算法这三大块,不一样的开发方向可能有不一样的侧重,但基础总的来讲就是这些。我不推荐经过去网上看教程来学习这些基础知识,由于能用短短几篇文章讲明白的事情不叫基础,至少我没见过写得这么深刻浅出的文章。算法

不知道有多少读者和我同样有过这样的困扰:“我知道某些东西很重要,因此去百度查了资料,可是查到的文章质量不好,正确率没有保证”。这实际上是正常的,优秀的文章通常都放在优秀的做者的我的博客上,这偏偏是搜索引擎的盲区,因此通常只能搜到 CSDN、博客园这种地方的文章。天然就没法保证文章质量。

出于这种考虑,我在文章最后的复习资料中,提供了用于学习相关基础知识的书籍,若是您刚好是 iOS 开发者,还能够阅读我收集的一些高质量文章,正确性比较有保证(我写的除外)。

除了准备通用的基础知识之外,简历也是一个很重要的环节。一直很仰慕唐巧老师的猿题库,无奈简历太差,都没有收到面试邀请。后来好好改了简历之后,就没有这种问题了。关于简历的书写,推荐两篇文章:如何写面向互联网公司的求职简历程序猿简历模板。你也能够参考个人简历,没有亮点,就当是抛砖引玉。

最后,固然是准备好相关岗位的基础知识了。做为 iOS 开发者,虽然 Swift 已经发布了快两年,可是大公司转向 Swift 的动做还不明显,因此 Objective-C 几乎是必备项,Swift 都不必定能算是加分项。iOS 方面的知识也必不可少,虽然招聘信息上写着若是基础扎实,零 iOS 基础也能够,可是现实每每是比较残酷的。

个人面试经历

扯了这么多,终于进入正题了,分享一下个人面试经历。题目以下,破折线后面是简单的解决思路

百度

一面:约 1.5 小时

首先是四个算法题:

  1. 不用临时变量怎么实现 swap(a, b)——用加法或者异或均可以
  2. 二维有序数组查找数字——剑指 offer 第 3题
  3. 亿级日志中,查找登录次数最多的十个用户——(不肯定对不对,个人思路是)先用哈希表保存登录次数和ID,而后用红黑树保存最大的十个数。剑指 offer 第 30题
  4. 简述排序算法——快排,partion 函数的原理,堆排(不稳定),归并排序,基数排序。

而后有一个智力题,没完整的答出来,好像影响不是很大。

最后是 iOS 相关,面试官问的很开放,都是谈谈本身的理解:

  1. 说说你对 OC 中 load 方法和 initialize 方法的异同。——主要说一下执行时间,各自用途,没实现子类的方法会不会调用父类的?
  2. 说说你对 block 的理解。—— 三种 block,栈上的自动复制到堆上,block 的属性修饰符是 copy,循环引用的原理和解决方案。
  3. 说说你对 runtime 的理解。——主要是方法调用时如何查找缓存,如何找到方法,找不到方法时怎么转发,对象的内存布局。
  4. 说说你对 MVC 和 MVVM 的理解。—— MVC 的 C 太臃肿,能够和 V 合并,变成 MVVM 中的 V,而 VM 用来将 M 转化成 V 能用的数据。
  5. 说说 UITableView 的调优。——一方面是经过 instruments 检查影响性能的地方,另外一方面是估算高度并在 runloop 空闲时缓存。
  6. 谈谈你对 ARC 的理解。ARC 是编译器完成的,依靠引用计数,谈谈几个属性修饰符的内存管理策略,什么状况下会内存泄露。

一面的问题很是基础,主要是算法和 Objective-C,由于准备比较充分,基本上答出来 80% 吧。大约一周后忽然二面。

二面:约 0.5 小时

二面比较忽然,显示简单的自我介绍,而后问了三个问题:

  1. 野指针是什么,iOS 开发中什么状况下会有野指针?——野指针是不为 nil,可是指向已经被释放的内存的指针,不知道何时会有,若是有知道的读者还望提醒。
  2. 介绍 block。—— (接第一问) 我让面试官提示我一下何时会有野指针,他说用 block 时,我表示仍是不知道,只知道 block 会有循环引用。因而就扯回了一面的问题。
  3. 说说你是怎么优化 UITableView 的。——仍是一面的问题。。。。。。。。。。。

虽然经过了,可是几乎又问了一遍一面的问题让我感受对方不太认真。

三面:北京 onsite,约 2.5 小时

首先是给一个小时,手写算法两个算法题。接下来问了 TCP 握手相关的。最后问了 OC 的一些细节问题。

网易

笔试

主要是计算机方面的大杂烩,涉及操做系统,网络,移动开发,算法等。难度不大,目测是为了淘汰浑水摸鱼的人,就不列出题目了,算法有三题,直接在线写(木有 IDE 表示很忧伤):

  1. 很长一道题,读了好久才读懂,目测是 DFS,可是最后没时间了,写了个思路。
  2. 把 "www.zhidao.baidu.com" 这样的字符串改为 "com/baidu/zhidao/www"。——老题目了,剑指 offer 的,两次逆序排列便可。
  3. 求数组中和为某个值的全部子数组,好比数组是 [5,5,10,2,3] 一共有四个子数组的和是 15,好比 [5,10][5,10][10,2,3][5,5,2,3]。这个就是简单的递归了,分两种状况,当前位置的数字在子数组中,以及不在子数组中。

一面

所有是 iOS 题,多是以为算法已经面过了:

  1. 介绍 block。——我提到栈上的 block 在 ARC 下会自动复制到堆上,面试官问我从 iOS 4 仍是 5 开始支持这一特性,表示不知道,我又不是学 OC 历史的,后来想一想多是公司内部老项目有这个坑。
  2. ARC 会对代码作什么优化?——好比 NSString *s2 = s1; s2 = nil 这样的语句,可能就不会有 retainrelease 方法了。
  3. 介绍一下 MVVM 和 RAC。——多是我简历的某个角落写了用过 RAC,被挖出来了,大概谈了一下,结果面试官问我数据的双向绑定怎么作,bind 函数了解过么,果断说已经忘了😂😂😂
  4. 介绍本身用过哪些开源库。——Masonry 和 SnapKit,AFNetWorking,MKNetworkKit,Alamofire,Mantle,SDWebImage
  5. 若是让你写,你能实现么?——固然不能,否则还要实习?
  6. 读过某个库的源码么?——扯了一点 SDWebImage,后来被告知这个库用了 runloop 来保证滑动是加载数据的流畅性,本身看了源码后表示没有发现,惟一用到 runloop 地方是保证后台线程一直跑,也有多是我理解错了,若是错误欢迎指正。
  7. SDWebImage 下载了图片后为何要解码?——当时蒙住了,面试官很 nice 的解释了一下,说是要把 png 文件创建一个什么内存映射,目前还不太懂,有空研究一下。

原本觉得面的这么差确定是挂了,没想到仍是过了一面。过了不到一个小时,HR 电话打过来,约了两天后二面。

二面

纯数学和算法:

  1. 下面这段代码的输出结果是:

    int main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1); printf(“%d,%d”,*(a+1),*(ptr-1)); }

    答案是 2 和 5。a 是指向数组开头元素的指针,a + 1 就是指向下一个元素的指针,因此星号求值之后是 2。&a 至关因而数组的指针,&a + 1 是数组后面一个数组的指针,而后转换成int *类型是 5 这个数字后面的一个数字的指针。再减一就是指向 5 的指针,因此星号求值之后是 5。

  2. 某个地方天气有以下规律:若是第一天和次日都不下雨,则第三天下雨的几率为30%;若是第一天和次日中有任 意一天下雨,则第三天下雨的几率为60%。问若是周一周二都没下雨,那么周四下雨的几率为_

    简单的几率题,答案是:30% * 60% + 70% * 30% = 39%

  3. 某痴迷扑克的小团体喜欢用23456789TJQKA来计数,A后面是22,23,...,2A,32,...,AA,222,... 依次类推。
    请用C/C++或Java写个程序,将用字符串表示这种计数法转换成字符串表示的10进制整数。其中,该计数法的2就对应于十进制的2,以后依次递增。C/C++函数接口: char pokToDec(char )

    个人解决思路是进制转换,相似于 16 进制转换 10 进制这种,最后再把数字转成 char * 类型。

而后好像没结果了,多是编程实现太渣了?

其余我知道的面试题

阿里一面:

  1. MVC 具备什么样的优点,各个模块之间怎么通讯,好比点击 Button 后 怎么通知 Model?
  2. 两个无限长度链表(也就是可能有环) 判断有没有交点
  3. UITableView 的相关优化
  4. KVONotificationdelegate 各自的优缺点,效率还有使用场景
  5. 如何手动通知 KVO
  6. Objective-C 中的 copy 方法
  7. runtime 中,SELIMP 的区别
  8. autoreleasepool 的使用场景和原理
  9. RunLoop 的实现原理和数据结构,何时会用到
  10. block 为何会有循环引用
  11. 使用 GCD 如何实现这个需求:A、B、C 三个任务并发,完成后执行任务 D。
  12. NSOperationGCD 的区别
  13. CoreData 的使用,如何处理多线程问题
  14. 如何设计图片缓存?
  15. 有没有本身设计过网络控件?

阿里二面:

  1. 怎么判断某个 cell 是否显示在屏幕上
  2. 进程和线程的区别
  3. TCPUDP 区别
  4. TCP 流量控制
  5. 数组和链表的区别
  6. UIView 生命周期
  7. 若是页面 A 跳转到 页面 B,A 的 viewDidDisappear 方法和 B 的 viewDidAppear 方法哪一个先调用?
  8. block 循环引用问题
  9. ARC 的本质
  10. RunLoop 的基本概念,它是怎么休眠的?
  11. Autoreleasepool 何时释放,在什么场景下使用?
  12. 如何找到字符串中第一个不重复的字符
  13. 哈希表如何处理冲突

面试收获

1. 算法题怎么答

面试官可能会问到你闻所未闻的算法,这时候你不该该本身瞎想,而是先和面试官把问题讨论清楚。要知道,经过沟通弄明白复杂的问题也是一种能力,在和面试官交流的过程当中,不只仅能够搞清楚题目真正的意思是什么,还能够展示本身良好的交流沟通能力。因此千万不要由于紧张或者害羞而浪费此次大好的机会。

有些题目似曾相识,可是暂时没有思路。这时候不妨告诉面试官,给我一些时间思考这个题。而后不要急,不要慌,就当他不存在,拿出纸和笔慢慢算(这充分说明了面试戴耳机的重要性)。你必定要坚决一个信念:“任何一道稍微有难度的算法题,除非作过,不然必定是须要时间想的”。因此,合理的安排思考时间吧。若是十几分钟都想不出来,能够直接放弃。

有时候面试官会要求在线编程,相信我,他不会无聊到盯着你的代码看的,面试官通常都很忙,他也有本身的工做要完成,因此你就当是用本身的 IDE 就好。在线编程每每是一个中等难度的问题,因此不要本身吓唬本身。同时要注意代码格式的规范,适当的注释,提早编写好测试用例等,即便没有解决问题,也至少要把本身良好的编程习惯展现给面试官。

2. 遇到不会的问题怎么处理

这个问题有多是面试官故意说得含糊不清,考察你的交流能力,也有多是无心的,或者是你的理解方式出现了误差。无论是以上哪一种问题,你都应该先和面试官交流,直到你搞懂了面试官要问你什么,而不是按照本身的理解说了一堆无用的东西。

举个例子,面试官可能会问了一道算法题:“如何判断两个无限长度的链表是否有交点?”。对于“无限长度”能够有不一样的理解,若是真的是有无穷多个节点,那显然这个问题是没法解决的。但若是链表仅仅是有环,那么仍是能够解决的。若是面试官的本意是链表有环,但你错误的理解成了无穷多个节点,那么必然会致使没法回答这个问题。并且这并不是能力不足,而是属于交流沟通方面的失误,这也正是我想分享的“技巧”。

还有一些问题,虽然你没有接触过,可是因为对相似的问题或者状况有过思考,因此能够合理假设。好比面试官问 “ARC 会对代码作什么样的优化?”。咱们知道 ARC 的本质就是在合适的地方插入 retainrelease 等方法,那么就应该从这个角度出发去思考问题。

显然分别执行 retainrelease 操做是没有必要的,那么就能够构造出相应的例子:

NSString *s1 = @"hello"; NSString *s2 = s1; NSString *s2 = nil;

因为这种问题咱们没有真正实践过,因此能够委婉的告诉面试官:“根据个人推理,可能会有……”。

3. 遇到真的不会的问题怎么处理

遇到不会的问题果断认可啊。若是是基本问题,好比问你哈希表怎么实现,你说不会,那么此次面试可能就悬了。若是是有必定难度的问题,那么你认可不会,也是一种明智之举,毕竟人无完人,一个问题不会并不能全盘否认一我的的能力。

可是比较糟糕的一种状况是,面试者因为过度紧张,担忧答不上面试官的问题会有严重后果,因此尝试着去敷衍面试官。好比:“我猜是 xxx 吧”,“我以为多是 ……”,更有甚者直接装逼:“这个我试过,不就是 xxx 么”。要知道,此时的你,因为紧张,在心态上已经输给了面试官,更况且面试官问你的问题必定是他有把握的,你以为这时候你负隅顽抗会有几成胜算呢?

因此,面试官问我“堆排序”的细节时,因为我当时忘了堆排序是怎么实现的,因此我直接告诉他我记不清了。另外一个主动认输的例子是面试官问我 RAC 如何实现双向绑定,我告诉他这个是我当时学习的时候写过的 demo,由于不经常使用,已经只记得一些简单的概念了。

最后,还须要保持一个平稳的心态:“面试时尽力就好,遇到本身不会的问题也是正常状况”。若是面试者顺利答对了全部问题,不免会让面试官感到一丝尴尬,面试者也有可能会产生一些别的情绪。因此,咱们要作的只是把本身的能力展现给面试官,作到不骄不躁。

4. 准备杀手锏

除了可以回答上面试官的问题之外,我建议本身准备一两个杀手锏级别的话题。所谓的杀手锏,至少具有如下几个特征:

  • 你亲自动手试验过。所谓实践是检验真理的惟一标准,数据是不会说谎的。
  • 问题有足够的深度。一面的面试官多是你的直接上司,二面通常就是更改级别的。你的深度必定要远超其余面试者,让一面面试官以为本身没有十足把握,让二面面试官以为这是一个好话题,本身的手下都不必定能有这么独到深入的看法。
  • 你对这个问题理解的足够深刻,不管是广度仍是深度都达到必定水平。

以 iOS 中的 UITableView 的调优为例,我自认为对它有必定的理解,同为 iOS 开发者的读者能够阅读这篇文章:UIKit性能调优实战讲解,同时我还仔细研究了 sunnyxx 大神的 优化UITableViewCell高度计算的那些事

这一类的话题一般须要仔细研究官方文档,iOS 开发者还能够观看 WWDC 视频,而后花上充足的时间去总结。好比我写 iOS自定义转场动画实战讲解 这篇文章就花了至少三天时间,包括大年初一一成天。

因为此类话题数量很少,因此准备一个或数个便可,面试时能够有意识的将面试官引导到这些话题上去,从而充分的展现本身。

5. 心态

一般状况下,面试结果都会在 1 - 3 天内知道。有的面试官会当场告诉你经过了,有的公司面试结束后几个小时就能出结果。

但有些时候,因为某些缘由(我也不清楚。。。。多是比较忙?),你迟迟没法获知面试结果。这时候你能够选择耐心等待,获知直接给 HR or 内推者发送邮件。通常来讲面试结束后三天还没收到通知,你能够发送邮件询问或者再等等。

复习资料

对于读到这一段的读者,为了感谢你耐心的听我废话了这么久,送上一波精心整理的干货和资料。不敢说彻底没有错,可是应该比本身去查要靠谱得多。主要涉及算法、网络、操做系统、Objective-C 和 iOS 五个方面。若是你不是 iOS 开发者,相信前三部分的资料也或多或少可以帮上你。

算法

这一部分的内容主要分为如下几个部分:字符串、数组与查找、链表、树以及其余基础问题。

总的来讲,算法问题能够分为如下三类:

  1. 基础问题:即便是新手,一眼看过去就有思路,只是实现的时候须要注意细节。
  2. 普通问题:这些问题一般属于以上分类中的某一类,须要面试者掌握一些常见的思路,好比递归、动态规划、BFS/DFS、双指针、二分搜索 等。或者是直接考察数据结构的使用,如:哈希、栈和队列、链表等,若是具有了这些基础知识,此类题目一般可以比较快速的解决。
  3. 进阶问题:这些题的解题思路和普通问题类似,可是须要你事先有对应的知识积累,不然难以直接看出问题的本质。
  4. 疑难杂题:这类问题比较奇怪,解决它之后并不能给别的题目太多帮助,若是时间紧张能够暂时放弃。

通常来讲,一类问题难度不大,面试前简单复习一下,面试时当心仔细,全面思考便可。二三类问题是面试重点,须要提早准备。第四类问题一般出现较少,即便不会作,对最终评价的负面影响也不会有前三类那么大。

若是时间充裕,我建议阅读《剑指 Offer》这本书并配合 Leetcode 来巩固知识,在个人面试过程当中,出现不少书上的原题或者变体,我自认为没有由于算法而影响任何一次面试的成绩。若是时间紧张,你也能够只完成我列出的一些经典题目,在“【】”中标记了我对此题类型的分类,若是加星号表示此题在实际面试中出现过

PS: 最近有小伙伴被问到了哈希表的实现。这能够理解为算法,也能够归类为计算机基础知识。总的来讲你至少须要明白哈希值的特色和两种解决冲突的方式:拉链式和开放寻址。

字符串

  1. 【3】最长回文子串
  2. 【3】最长无重复子串
  3. 【1*】字符串转数字
  4. 【4】KMP 算法
  5. 【2】字符串全排列
  6. 【2*】翻转字符串

动态规划

  1. 【2】背包问题
  2. 【3】连续子数组的最大和
  3. 【4】实现简单的正则表达式匹配

数组

  1. 【3】求两个等长、有序数组的中位数(二分法)
  2. 【4】求两个不等长、有序数组的中位数
  3. 【3】旋转数组求最小值【3】旋转数组求查找某个值是否存在(二分法)
  4. 【4*】每行从左到右,每列从上到下递增的二维数组中,判断某个数是否存在(剑指 offer 第 3 题)
  5. 【3*】数组中出现次数超过一半的数字
  6. 【3*】第 k 大的数(拓展:最大的 k 个数)
  7. 【3*】有序数组中某个数字出现的次数(提示:利用二分搜索)

链表

  1. 【2】反转链表(使用递归和迭代两种解法,了解头插法)
  2. 【3】删除链表的当前节点
  3. 【3】删除倒数第 k 个节点
  4. 【1】两个有序链表合并
  5. 【4】复杂链表的复制
  6. 【2*】判断链表是否有环
  7. 【3*】两个链表的第一个公共节点(提示:考虑链表有环的状况)
  8. 【3】删除链表中重复节点

  1. 【3】根据中序和后序遍历结果重建二叉树【3】根据中序和前序遍历结果重建二叉树
  2. 【2】翻转二叉树
  3. 【2】从上往下打印二叉树 (BFS 的思想)
  4. 【3】判断某个数组是否是二叉树的后序遍历结果 (剑指 offer 第 24 题)
  5. 【3】二叉树中和为某个值的路径
  6. 【3*】二叉树中某个节点的下一个节点 (强烈推荐准备一下,剑指 offer 第 58 题)

  1. 【2】用两个栈实现队列【2】用两个队列实现栈
  2. 【2】实现一个栈,能够用常数级时间找出栈中的最小值
  3. 【3】判断栈的压栈、弹栈序列是否合法(剑指offer 第 22 题)

排序

了解如下排序的时间、空间复杂度,是否稳定,实现原理

  1. 归并排序、拓展:求数组中的逆序对个数
  2. 快速排序 重点:partion 函数的实现
  3. 堆排序
  4. 数组元素值域已知时,考虑 基数排序桶排序

位运算

  1. 【2】给一个十进制数字,求它的二进制表示中,有多少个 1 (n &= n - 1)
  2. 【3】给一个数组,全部数字都出现了偶数次,只有一个出现了一次,找出这个数
  3. 【4】给一个数组,全部数字都出现了三次,只有一个出现了一次,找出这个数
  4. 【3】给一个数组,全部数组都出现了偶数次,只有两个数字出现了一次,找出这两个数

网络层

根据不一样的面试岗位,侧重点略有不一样。对 iOS 和 Android 开发者来讲,HTTP 考的略少,以 TCP 和 UDP 为主。其实 UDP 基本上只会考察和 TCP 的区别。

固然还有一些常见的基础问题,好比 Cookie 和 Session 的考察,POST 和 GET 的考察,HTTPS 的简单了解等。这些问题在个人博客中都有简单的总结。

总结了一些资料,数字序号越大的资料表示篇幅更长,耗时更久,难度更大,讲解更细致。破折线后表示预计须要多久能够读完。

  1. 【博客】个人六篇总结————不到一周
  2. 【书】图解 TCP/IP————半个月
  3. 【书】TCP/IP 详解————没读过,感受至少须要一个月
  4. 【书】TCP/IP 协议簇————没读过,感受至少须要一个月

光读书是没有用的,一问到实际问题很容易懵逼,如下是我总结的一些问题:

  1. 简介 TCP 和 UDP 区别,他们位于哪一层?
  2. 路由器和交换机的工做原理大概是什么,他们分别用到什么协议,位于哪一层?
  3. 描述TCP 协议三次握手,四次释放的过程。
  4. TCP 协议是如何进行流量控制,拥塞控制的?
  5. 为何创建链接时是三次握手,两次行不行?若是第三次握手失败了怎么处理
  6. 关闭链接时,第四次握手失败怎么处理?
  7. 你怎么理解分层和协议?
  8. HTTP 请求中的 GET 和 POST 的区别,Session 和 Cookie 的区别。
  9. 谈谈你对 HTTP 1.1,2.0 和 HTTPS 的理解。

操做系统与编译

我被问到的操做系统问题不多,因此仅仅总结了一些自认为比较重要的问题。关于这一部分的知识,推荐阅读《程序员的自我修养》,若是时间有限,你能够阅读个人《程序员的自我修养读书笔记》,并思考这些问题:

  1. 源代码是怎么变成可执行文件的,每一步的做用是什么?(预编译,词法分析,语法分析,语义分析,中间语言生成目标代码生成,汇编,连接)
  2. 应用层、API、运行库、系统调用、操做系统内核之间的关系是什么?
  3. 虚拟内存空间是什么,为何要有虚拟内存空间。
  4. 静态连接和动态连接分别表示什么,大概是怎么实现的?
  5. 可执行文件的结构如何?(分为哪些段)
  6. 它是怎么装载进内存的,为何要分段,分页,页错误是什么?
  7. 进程的内存格局是怎样的?(堆、栈、全局/静态区,代码区,常量区)
  8. 堆和栈的区别,函数调用和栈的关系
  9. 进程和线程的区别
  10. 异步和同步,串行,并发,并行的区别
  11. 多并发任务,仅多线程能加快速度么(不能,会变慢,有线程切换的开销)
  12. 多个线程之间能够共享那些数据
  13. 进程之间如何通讯
  14. 介绍几种锁,他们的用途和区别

关于多线程相关的,推荐阅读这篇文章的前面一小部分——iOS多线程编程——GCD与NSOperation总结

关于操做系统和编译方面的文章,除了读原书和个人读书笔记外,还能够参考这篇文章——修改一个数字破解Mac上的应用

OC

首先两本必备的神书必定是要读完的。一本是讲 OC 的《Effective Objective-C 2.0》,中文名叫:“编写高质量 iOS 与 OS X 代码的 52 个有效方法”。另外一本书叫:《Objective-C 高级编程》。前者讲解 OC 中各类细节,后者主要讲了 ARC、Block 和 GCD。

光是读书,思考不够,很容易在面试时被问懵逼,因此建议一遍尝试回答面试真题,一边阅读如下总结性的文章,重要性不分前后:

  1. 检测内存泄露
  2. KVO与KVC原理KVO、Notification、Delegate优缺点最推荐的官方文档
  3. GCD 与 NSOperation
  4. Runtime
  5. block
  6. atomic 线程安全@synchronized
  7. 对象的深浅复制
  8. 招聘一个靠谱的iOS
  9. 消息传递机制
  10. 深刻理解Objective-C:Category

强烈推荐第八篇文章,作完这上面的题目基本上能够应付大多数 OC 方面的问题了。

iOS 开发

  1. RunLoop
  2. Cell 图片异步加载优化
  3. iOS 函数式编程的实现 && 响应式编程概念
  4. 内存恶鬼drawRect
  5. UIKit 性能调优(主要是UITableView)
  6. 优化UITableViewCell高度计算的那些事
  7. 高性能图片架构与设计
  8. 轻量化视图控制器
  9. UIView的生命周期
  10. 高效设置圆角
  11. 事件的传递和响应机制
  12. ReactiveCocoa 和 MVVM 入门

其中须要重点了解 runloop,它不只仅是简单的“跑圈”的 概念,不少问题其实都与它有关,建议认真阅读 ibireme 大神的总结

相关文章
相关标签/搜索