ios面试心得

 

第一部分:面试题

 

注意,下面这些题只是我准备的题库。在实际面试的时候我会根据面试者的水平抽出相应的题目来出的。git

技术

基础

 

  1. 为何说Objective-C是一门动态的语言?github

  2. 讲一下MVC和MVVM,MVP?面试

  3. 为何代理要用weak?代理的delegate和dataSource有什么区别?block和代理的区别?缓存

  4. 属性的实质是什么?包括哪几个部分?属性默认的关键字都有哪些?@dynamic关键字和@synthesize关键字是用来作什么的?安全

  5. 属性的默认关键字是什么?并发

  6. NSString为何要用copy关键字,若是用strong会有什么问题?(注意:这里没有说用strong就必定不行。使用copy和strong是看状况而定的)app

  7. 如何令本身所写的对象具备拷贝功能?框架

  8. 可变集合类 和 不可变集合类的 copy 和 mutablecopy有什么区别?若是是集合是内容复制的话,集合里面的元素也是内容复制么?异步

  9. 为何IBOutlet修饰的UIView也适用weak关键字?ide

  10. nonatomic和atomic的区别?atomic是绝对的线程安全么?为何?若是不是,那应该如何实现?

  11. UICollectionView自定义layout如何实现?

  12. 用StoryBoard开发界面有什么弊端?如何避免?

  13. 进程和线程的区别?同步异步的区别?并行和并发的区别?

  14. 线程间通讯?

  15. GCD的一些经常使用的函数?(group,barrier,信号量,线程同步)

  16. 如何使用队列来避免资源抢夺?

  17. 数据持久化的几个方案(fmdb用没用过)

  18. 说一下AppDelegate的几个方法?从后台到前台调用了哪些方法?第一次启动调用了哪些方法?从前台到后台调用了哪些方法?

  19. NSCache优于NSDictionary的几点?

  20. 知不知道Designated Initializer?使用它的时候有什么须要注意的问题?

  21. 实现description方法能取到什么效果?

  22. objc使用什么机制管理对象内存?

 

中级

Block

 

  1. block的实质是什么?一共有几种block?都是什么状况下生成的?

  2. 为何在默认状况下没法修改被block捕获的变量? __block都作了什么?

  3. 模拟一下循环引用的一个状况?block实现界面反向传值如何实现?

 

Runtime

 

  1. objc在向一个对象发送消息时,发生了什么?

  2. 何时会报unrecognized selector错误?iOS有哪些机制来避免走到这一步?

  3. 可否向编译后获得的类中增长实例变量?可否向运行时建立的类中添加实例变量?为何?

  4. runtime如何实现weak变量的自动置nil?

  5. 给类添加一个属性后,在类结构体里哪些元素会发生变化?

 

RunLoop

 

  1. runloop是来作什么的?runloop和线程有什么关系?主线程默认开启了runloop么?子线程呢?

  2. runloop的mode是用来作什么的?有几种mode?

  3. 为何把NSTimer对象以NSDefaultRunLoopMode(kCFRunLoopDefaultMode)添加到主运行循环之后,滑动scrollview的时候NSTimer却不动了?

  4. 苹果是如何实现Autorelease Pool的?

 

类结构

 

  1. isa指针?(对象的isa,类对象的isa,元类的isa都要说)

  2. 类方法和实例方法有什么区别?

  3. 介绍一下分类,能用分类作什么?内部是如何实现的?它为何会覆盖掉原来的方法?

  4. 运行时能增长成员变量么?能增长属性么?若是能,如何增长?若是不能,为何?

  5. objc中向一个nil对象发送消息将会发生什么?(返回值是对象,是标量,结构体)

 

高级

 

  1. UITableview的优化方法(缓存高度,异步绘制,减小层级,hide,避免离屏渲染)

  2. 有没有用过运行时,用它都能作什么?(交换方法,建立类,给新建立的类增长方法,改变isa指针)

  3. 看过哪些第三方框架的源码?都是如何实现的?(若是没有,问一下多图下载的设计)

  4. SDWebImage的缓存策略?

  5. AFN为何添加一条常驻线程?

  6. KVO的使用?实现原理?(为何要建立子类来实现)

  7. KVC的使用?实现原理?(KVC拿到key之后,是如何赋值的?知不知道集合操做符,能不能访问私有属性,能不能直接访问_ivar)

 

项目

 

  1. 有已经上线的项目么?

  2. 项目里哪一个部分是你完成的?(找一个亮点问一下如何实现的)

  3. 开发过程当中遇到过什么困难,是如何解决的?

 

学习

 

  1. 遇到一个问题彻底不能理解的时候,是如何帮助本身理解的?举个例子?

  2. 有看书的习惯么?最近看的一本是什么书?有什么心得?

  3. 有没有使用一些笔记软件?会在多平台同步以及多渠道采集么?(若是没有,问一下是如何复习知识的)

  4. 有没有使用清单类,日历类的软件?(若是没有,问一下是如何安排,计划任务的)

  5. 日常看博客么?有没有本身写过?(若是写,有哪些收获?若是没有写,问一下不写的缘由)

有关技术类的问题能够在评论区留言,我重点说一下这轮面试的心得和体会。

 

第二部分:心得

 

面试者千万不要答非所问

 

若是让我选一个让面试官以为印象减分的点,答非所问应该是首当其冲的。

 

面试者必定要知道面试官问的点是什么。

 

  • 若是在知道面试官问的点,可是本身殊不知道答案的时候,能够提出思路,思考过程。其实有几回面试者在个人引导下很容易就把答案说出来了,认清问题的点是解决问题的一半。

  • 若是没有理解好面试官问的问题,必定要事先和面试官确认好。

 

其实这也属于沟通能力的一点:若是不能保证和对方沟通内容的一致性,本身弄个filter把对方的话都曲解了,之后合做的时候又怎能保证沟通好呢?

 

面试者必定不要来得太早

 

这里说的来得太早,是来得太早并告知面试官本身已经来了。

 

由于在约定好的面试时间以前,每每面试官还有别的事情在作,若是他知道你来的很早,就可能会扰乱他的计划。有一位面试者早来了1个小时,结果把咱们的面试计划打乱了,并且正好是个人第一次面试,因此真的是有点措手不及。

 

求职者和公司定下来的时间属于一个约定,约定是要遵照的。并且遵照约定一样也是对对方的尊重。若是入职以前都没能把握好,入职以后又如何能保证把握好呢?

实践与理论的脱节,让人很不安

 

能作出来项目,可是基础知识很薄弱

 

几乎每位面试者都能给我展现他作的一些app,虽然没有很难的功能,但也都算是有板有眼。可以让我比较意外的是,虽然能作出有模有样的app,但当我问到不少基础的问题的时候却答不上来,好比属性和成员变量的区别,属性的默认关键字,Designated Initializer的概念等等。。

 

这不由让我怀疑他们的代码的稳定性,更怀疑他们治学,作技术的态度。

 

虽然说技术活须要实践的磨练,但和理论脱节的技术是钻不深的。可能有人会说个人面试题过于理论,实际中用不到。但有些时候,在实际开发中遇到的一些问题每每就是由于一些很基本的东西没有弄清致使的,相信你我都深有体会。

 

并且,咱们都知道技术的提高是阶梯式的。什么是阶梯式的呢?就是可能咱们会有比较长的时间才会有一个突破。但这个突破来的有多快,提高的有多高,是跟平时每一个细小知识点的掌握程度是分不开的。

 

由于知识也是有复利效应的,准确地掌握越多的知识点,在之后的学习过程当中,这些知识点相互之间想成的积极做用会愈来愈大:对新知识的理解更快,对问题的定位会更准,解决问题的方法也会越多。相反,若是你每一个问题都得过且过,这些结果的复合做用就会致使你从此很难会有所突破了。

 

真的可能被简历骗到

 

上家的薪资很高,可是实际能力很不符

 

有一位面试者在简历里号称上一个工做拿了15k,但当我问到NSString属性使用strong仍是copy做为关键字的时候他却说是strong,甚至连delegate都拿不许使用strong仍是weak,我就有些奇怪了。

 

看技术博客和技术书籍的人仍是不多的

 

只依赖于公司里的项目应该是不够的,毕竟不是每一个公司里都有上乘的代码和技术

 

面试了大概20我的,可是真正有看过技术博客和技术书籍的真的很少,更别提Github了。不过其中一位面试经过者是有github帐号的,而且有几个小项目,印象很是好,加了很多分。

 

我相信在这一行的将来,简历里面github帐号和博客绝对会愈来愈受重视:

    • 一方面简历真的是目不暇接,并且同时千篇一概,很难找出亮点。

    • 另外一方面,若是能够把本身的代码和成长展现给招聘公司,就会使得本身的能力在公司面前变得更加纯粹和透明,更有助于找到适合你本身的公司。

相关文章
相关标签/搜索