iOS面试题 — 老生常谈

前言

就最近两周找工作的情况来看,市场对iOS工程师的需求并没有因为经济发展受阻而大幅减少,只是市场对iOS工程师的要求越来越高,像runtime、runloop和KVO等相关机制必须要烂熟于心。你若没看过OC runtime的源码,而仅仅是死记硬背了一些面试题就拿到了Offer,只能说你很幸运,否则刷面试题直接去面试必定“凶多吉少”,建议在刷题的同时最后实现一遍。

对一些大厂来说,算法和网络更是面试题的必考题,也是基础中的基础,同时也是让之前没有接触过并想进入大厂的童鞋们最费时费力的两个基础。就网络的相关协议来说,啃一周的书也基本能拿下,也可以参考网络面试题,想加深印象可进行网络调试。对于算法,请参考这篇文章,或买本剑指Offer来学习。只是对于没有算法基础的童鞋们,在筛选一些算法题后,保守估计也需要两周时间来消化,而且还很容易忘记,多练,多写(手写)以加深印象,然后记住其核心的算法思路即可。

面试题

每个面试官都有自己擅长的技术栈或技术树,所以不同的面试官会出不同的面试题,我们注定无法全部覆盖,隐藏只能在我们有限的能力范围内去了解或掌握更多相关知识点。以下根据面试题进行分门别类,你不知道或答不上来,不代表你能力不符,也不要有其它负面想法,更不要去追求掌握更多的面试题,因为没有哪一份面试题能够一劳永逸。相反,如果你非常善于某个方向(目前没有哪个iOS开发者可以说精通iOS所有的framework吧?),也是用人单位非常看重且乐于接受的。

以下排名不分先后

面向对象的基础题

  • 面向对象的几个设计原则?
  • Hash表的实现?
  • 什么是进程和线程?有什么区别?
  • 内存的几大区域?各自的职能?
  • 架构、框架和设计模式的区别?
  • MVC、MVVM和MVP架构的不同?

iOS基础面试题

UI

  • UIView和CALayer的区别?(CALayer的逻辑树、动画树和显示树)
  • loadView是干嘛用的?
  • layoutIfNeeded、layoutSubviews和setNeedsLayout的区别?
  • iOS的响应链?什么情况会影响响应链?
  • 说几种给UIImageView添加圆角的方式?
  • iOS中实现动画的方式有哪些?
  • 使用drawRect有什么影响?

OC基础

  • NS_ENUM和NS_OPTIONS的区别?
  • iOS的内存管理机制?
  • @property后的相关修饰词有哪些?可变类型和不可变类型如何修饰?
  • dynamic和synthesis的区别?
  • array为何用strong修饰?mutableArray为何用copy修饰?
  • 深拷贝和浅拷贝(注意NSString类型)?
  • Block的几种类型?
  • isEqual和“==”的区别?
  • id和NSObject的区别?
  • 通知、代理、KVO和Block的不同(结合应用场景回答)?
  • 什么是循环引用?__weak、__strong和__block的区别?
  • 内存泄漏、野指针和僵尸对象的区别?
  • nil、Nil、NULL、NSNull的区别?
  • static和const的区别?
  • iOS中有哪些设计模式?
  • 静态库和动态库的区别?
  • iOS中内省的几个方法?

OC进阶

  • Foundation和CoreFoundation的转换?
  • array和set的区别?查找速度和遍历速度谁更快?
  • 什么是内联函数?为什么需要它?
  • 图片显示的过程?
  • dispatch_once如何只保证只执行一次?
  • NSThread、NSRunLoop和NSAutoreleasePool三者之间的关系?
  • 分类可扩展的区别?(可从内存布局、加载顺序、分类方法和原类方法的执行顺序来回答)
  • OC对象是怎么被释放的?
  • CDDisplayLink和NSTimer的区别?
  • 用runtime实现方法交换有什么风险?

runtime源码相关

  • 知道AutoreleasePoolPage吗?它是怎么工作的?
  • KVO的底层实现?(看过RAC源码的应该知道,RAC监听方法也是基于此原理,只是稍微有些不同)
  • 被weak修饰的对象是如何被置nil的?知道SideTable吗?
  • 什么是关联对象?可以用来干嘛?系统如何管理管理对象?支持KVO吗?
  • isa、对象、类对象、元类和父类之间的关系?
  • 知道创建类的方法objc_allocateClassPair?方法里面具体做了什么事情?
  • class_ro_t 和 class_rw_t 的区别?
  • 除了objc_msgSend,还知不知道别的消息发送函数?
  • 什么是方法交换?怎么用的?

数据持久化

  • plist
  • NSUserDefault
  • NSKeyedArchiver
  • CoreData
  • SQLite(FMDB、Realm)

多线程

  • 串行队列和并发队列的区别?同步和异步的区别?
  • GCD和NSOperation的区别?
  • 如何让GCD的异步队列串行执行?

线程安全

  • 如何保证线程安全?
  • 什么是死锁?如何避免死锁?
  • 什么是优先倒置?

项目经验相关题

  • 什么时候重构?怎么重构的?
  • AppDelegate如何瘦身?
  • 如何解决卡顿?
  • 如何排查Crash?
  • 如何检测内存泄漏?有没有遇到内存警告?怎么解决的?
  • 有何优化App启动速度?(main前和main后)

开源库

这部分主要跟简历中提到的相关库有关,建议对简历中提到的开源库,一定要有所准备。

SDWebImage

SDWebImage几乎是每个iOS开发者都用过的开源库,也是在简历中曝光度比较高的开源库之一,同时也几乎是面试都会问到的,所以要准备充分再去。

  • 从调用到显示的过程?
  • 图片是怎么缓存的?
  • 怎么避免重复下载同一个URL地址的图片?

ReactiveCocoa

该库比较复杂,可问的问题也非常多,以下仅供参考

  • 冷热信号的区别?
  • 如何监听方法调用的?
  • bind方法做了什么?
  • RAC中的RACObserver和KVO有什么区别
  • RAC的map和flattenMap的区别

工具

  • Git、SVN?(问题可深可浅,浅:基本用法或相关命令,深:Git的工作原理)
  • CocoaPods(pod update和pod install的区别)
  • CI(持续集成、持续部署)

总结

除了跟同事或朋友一起创业,作为技术人员在找工作中,不管是HR面试还是技术面试,面试是不可避免的环节,所以我们如果很想加入某家公司,一定要做好充分的准备,保证一击即中。以上面试题也是在学习、工作和面试中积累的,肯定有很多没覆盖的部分,若大家有想补充的可以留言联系。以上所有题目的答案也都可以在网上搜索到,我也提供了一份提示答案,以供大家参考。

另:在这个变化莫测的时代,大家要与时俱进,不要在舒适区待太久,祝大家都能找到满意的工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值