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面试仍是技术面试,面试是不可避免的环节,因此咱们若是很想加入某家公司,必定要作好充分的准备,保证一击即中。以上面试题也是在学习、工做和面试中积累的,确定有不少没覆盖的部分,若你们有想补充的能够留言联系。以上全部题目的答案也均可以在网上搜索到,我也提供了一份提示答案,以供你们参考。架构

另:在这个变化莫测的时代,你们要与时俱进,不要在温馨区待过久,祝你们都能找到满意的工做。并发

相关文章
相关标签/搜索