【ios开发工程师互联网名企面试】一个iOS程序员的BAT面试经验和知识点总结

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

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

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

个人面试经历

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

百度

一面:约 1.5 小时

首先是四个算法题:ios

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

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

最后是 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% 吧。大约一周后忽然二面。github

二面:约 0.5 小时

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

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

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

三面:北京 onsite,约 2.5 小时

首先是给一个小时,手写算法:

  1. 给一个字符串,如何判断它是不是合法的 IP 地址,好比 “192.168.1.1” 就是合法的。
  2. 说说大数相加的思路,动手写代码实现。

没能写完,主要是大数相加的时候须要考虑负数,耽搁了一点时间。

而后让我简述 TCP 创建和关闭链接时,握手的过程。还问了前者为何是三次,后者须要四次?

接下来是设计了一个实际场景,为了简化问题,咱们考虑这个问题:假设有 10W 条电话号码,如何经过输入电话号码的某一段内容,快速搜索出来。好比输入 234 ,如下两个号码都会显示在搜索结果中:

  1. 123456789000
  2. 188888823400

其实最简单的解决方案是遍历全部字符串,而后用 KMP 算法。可是这样的问题是须要遍历 10W 个元素,效率比较低。我想到的是办法是使用索引。创建 100 个索引(00 到 99),好比输入 234时只须要在索引 23 对应的区域查找便可,能够加快 100 倍速度。可是缺点是插入数据时,须要更新多个索引,数据量会是原来的 10 倍。

目前尚未想到好的解决方案。有大神提醒说用字典树,有空研究一番。

最后问了 OC 的数组中,添加 nil 对象会有什么问题。当时没答上来,如今想一想很不该该,由于数组是以 nil 结尾的,若是添加了 nil ,后续就不能添加对象了。

网易

笔试

主要是计算机方面的大杂烩,涉及操做系统,网络,移动开发,算法等。难度不大,目测是为了淘汰浑水摸鱼的人,就不列出题目了,算法有三题,直接在线写(木有 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 这样的语句,可能就不会有retain 和 release 方法了。
  3. 介绍一下 MVVM 和 RAC。——多是我简历的某个角落写了用过 RAC,被挖出来了,大概谈了一下,结果面试官问我数据的双向绑定怎么作, bind 函数了解过么,果断说已经忘了:joy::joy::joy:
  4. 介绍本身用过哪些开源库。——Masonry 和 SnapKit,AFNetWorking,MKNetworkKit,Alamofire,Mantle,SDWebImage
  5. 若是让你写,你能实现么?——固然不能,否则还要实习?
  6. 读过某个库的源码么?——扯了一点 SDWebImage,后来被告知这个库用了 runloop 来保证滑动是加载数据的流畅性,本身看了源码后表示没有发现,惟一用到 runloop 地方是保证后台线程一直跑,也有多是我理解错了,若是错误欢迎指正。
  7. SDWebImage 下载了图片后为何要解码?——当时蒙住了,面试官很 nice 的解释了一下,说是要把 png 文件创建一个什么内存映射,目前还不太懂,有空研究一下。

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

二面

纯数学和算法:

  1. 下面这段代码的输出结果是:
    c
    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. KVO 、 Notification 、 delegate 各自的优缺点,效率还有使用场景
  5. 如何手动通知 KVO
  6. Objective-C 中的 copy 方法
  7. runtime 中, SEL 和 IMP 的区别
  8. autoreleasepool 的使用场景和原理
  9. RunLoop 的实现原理和数据结构,何时会用到
  10. block 为何会有循环引用
  11. 使用 GCD 如何实现这个需求:A、B、C 三个任务并发,完成后执行任务 D。
  12. NSOperation 和 GCD 的区别
  13. CoreData 的使用,如何处理多线程问题
  14. 如何设计图片缓存?
  15. 有没有本身设计过网络控件?

阿里二面:

  1. 怎么判断某个 cell 是否显示在屏幕上
  2. 进程和线程的区别
  3. TCP 与 UDP 区别
  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 的本质就是在合适的地方插入 retain 和 release 等方法,那么就应该从这个角度出发去思考问题。

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

<code style="border: 0px; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; font-family: "Microsoft YaHei", 微软雅黑, "Hiragino Sans GB", STHeiti, "WenQuanYi Micro Hei", SimSun, sans-serif, Lucida, Verdana, serif; line-height: 1.6;">NSString *s1 = @"hello";  
NSString *s2 = s1;  
NSString *s2 = nil;  
</code>

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

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 大神的总结


转载于:http://www.techug.com/iOS-bat-interview


【关于咱们】

天天名企社招内推(微信众号ourpush),专一于国内各大互联网公司社会招聘内推。天天更新最新互联网名企(包括但不限于BAT网易小米京东乐视携程等名企)内推信息,有技术岗、有产品岗、有运营岗、有设计岗、有交互岗、有销售岗,更有其余N多相关岗位!更多内推信息请扫描如下二维码关注查阅。