简介
runtime的相关问题
runtime也是iOS开发最核心的知识了,如果本文下面的问题咱们都解决了,那么应该对runtime的理解已经很深了。 runtime已经开源了,自己可以去官网找objc4。
结构模型
- 首先说明下runtime的内存模型(对象、isa、metaclass、类、结构体的存储信息等等)
- 为什么要设计metaclass
class_copyIvarList和class_copyPropertyList区别-
class_ro_t与class_rw_t的区别 category怎么被加载的,两个category的lo``ad方法的加载顺序,两个category的同名方法的加载顺序是怎样的?category和extension区别,能给NSObject添加Extension吗,结果如何?- 消息转发机制的理解以及消息转发机制和其他语言的消息机制优劣对比。
- 当方法调用的时候,方法查询-> 动态解析-> 消息转发 之前做了什么?
SEL、IMP、Method的区别和使用场景。load、initialize方法的有什么区别,继承关系中他们有什么区别?- 谈谈消息转发机制的优劣。
内存管理
weak的实现原理,SideTable的结构是什么样的?- 关联对象的应用,系统是如何实现关联对象的?
- 关联对象的如何进行内存管理的以及关联对象如何实现weak属性。
Autoreleasepool的原理?所使用的的数据结构是什么?ARC的实现原理?在ARC下对retain & release做了哪些优化?ARC下什么情况会造成内存泄漏?
其他
Method Swizzle注意事项。- 属性修饰符
atomic的内部实现是怎么样的,是否能保证线程安全? - iOS 中内省的几个方法有哪些?内部实现原理是什么?
class、object_getclass、objc_getClass这些方法有什么区别?
NSNotification相关
- 实现原理(结构设计、通知如何存储的、
name&observer&SEL之间的关系等) - 通知的发送时异步的,还是同步的
NSNotificationCenter接受消息和发送消息是否在一个线程里,如何异步发送消息?NSNotificationQueue是同步还是异步发送?在哪个线程响应?NSNotificationQueue和runloop的关系是怎样的?- 怎么保证通知接收的线程在主线程?
- 页面销毁时不移除通知会不会崩溃?
- 多次添加同一个通知会是什么结果?多次移除通知又是怎么样的?
- 下方的方式能接收到通知吗?为什么?
// 发送通知[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleNotification:) name:@"TestNotification" object:@1];// 接收通知[NSNotificationCenter.defaultCenter postNotificationName:@"TestNotification" object:nil];
Runloop & KVO
runloop
runloop对于一个标准的iOS开发者来说都是比较熟悉的至少不陌生,应该说熟悉runloop是标配,下面就随便列几个典型问题吧!
- app是怎么接收到触摸事件的?
- 只有主线程的
runloop是开启的原因? - 只在主线程刷新UI的原因?
- runloop和PerformSelector的关系?
- 怎么使线程保活?
多线程
主要以GCD为主
iOS开发中有几种类型的线程?分别对比。GCD有哪些队列,默认提供哪些队列?GCD有哪些方法api?GCD主线程和主队列的关系。- 怎么实现同步,有多少方式就说多少。
dispatch_once实现原理。- 何种情况下会死锁?
- 线程锁有哪些类型,分别介绍下作用和使用场景。
NSOperationQueue中的maxConcurrentOperationCount默认值。NSTimer、dispatch_source_t、CADisplayLink的优劣
Block
block的内部实现以及结构体是什么样的?block是否是类,有哪些类型?- 一个
int变量被__block修饰与否的区别?block的变量截获 block在修改NSMutableArray,需不需要添加__block呢?- 它是怎么进行内存管理的?
block可以用strong修饰吗?- 在解决循环引用时我们为什么要用
__weak、__strong修饰? block发生copy时机。Block访问对象类型的auto变量时,在ARC``MRC下有什么区别。
视图&图像相关
AutoLayout的原理以及性能如何?UIView和CALayer的区别。- 事件响应链。
drawrect和layoutsubviews调用时机。- UI的刷新原理。
- 什么是离屏渲染?
- 隐式动画 & 显示动画区别。
imageName和imageWithContentsOfFile区别。- 多个相同的图片,会重复加载吗?
- 图片是什么时候解码的,是怎么优化?
- 图片渲染是怎么优化?
- 当GPU的刷新率超过了iOS屏幕60Hz刷新率是什么现象以及怎么解决?
KVO
同runloop一样,kvo也是标配的知识点了,同样列出几个典型问题。
- 实现原理
- 怎么手动关闭
kvo? - 通过
KVC修改属性会触发KVO么? kvo的优缺点。- 哪些情况下使用
kvo会崩溃,如何防护崩溃?
性能优化
- 怎么做耗电优化,如何监控?
- 怎么做卡顿优化,如何监控?
- 怎么做启动优化,如何监控?
- 怎么做网络优化,如何监控?
开发证书
- 苹果使用证书的目的是什么?
- 开发者怎么在debug模式下把app安装到设备呢?
- AppStore安装app时的认证流程。
架构设计
典型源码的学习
虽然只是列出一些iOS比较核心的开源库,但是这些库包含了很多高质量的思想,源码学习的时候一定要关注每个框架解决的核心问题是什么,以及它们的优缺点,这才能算真正理解和吸收。
AFNSDWebImageJSPatch、Aspects(虽然一个不可用、另一个不维护,但这两个库都很精炼巧妙,很适合学习)Weex/RN, 笔者认为这种前端和客户端紧密联系的库其原理是必须要知道的。CTMediator、其他router库,这些都是常见的路由库,开发中基本上都会用到- 请圈友们在评论下面补充吧!
架构设计
- 、自动化埋点、可视化埋点、手动埋点。
MVC、MVP、MVVM设计模式。- 单例的弊端。
- 常见的设计模式。
- 常见的路由方案,以及优缺点对比。
- 如何保证项目的稳定性?
- 设计一个图片缓存框架(LRU)
- 如何设计一个
git diff? - 设计一个线程池,画出你的架构图。
- 你的app架构是什么,为什么这么做、有什么优缺点、怎么改进?
其他问题
PerformSelector和NSInvocation优劣对比。oc怎么实现多继承,怎么面向切面?- 哪些
bug会导致崩溃以及怎么防护崩溃? - 如何监控崩溃?
app的启动过程(主要考察LLVM编译过程、动态链接、静态链接、runtime初始化)。- 沙盒目录的每个文件夹划分的作用。
- 简单阐述下
match-o文件结构。
系统基础知识
- 线程和进程的区别。
HTTPS的握手过程。- 什么是中间人攻击,如何预防?
TCP的握手过程,为什么进行三次握手,四次挥手?- 堆和栈区的区别以及谁的占用内存空间大?
- 加密算法:非对称加密算法和对称加密算法的区别。
- 常见的非对称加密和对称加密算法有哪些?
MD5、Sha1、Sha256区别?charles抓包过程?不使用charles,4G网络怎么抓包?
数据结构与算法
对于移动开发者来说,一般情况下不会遇到非常难的算法,主要以数据结构为主,大鑫列出一些必会的算法,当然自己有时间了可以去LeetCode上刷刷题。
- 深搜广搜
- 二叉树相关操作
- 字符串处理
- 链表
- 栈&队列
- 八大排序算法
- 基本的动态规划题、贪心算法、二分查找
文章到这里就结束了,感谢你的观看,只是有些话想对读者们说说:
如果你正在面试,或者正准备跳槽,不妨看看我精心总结的面试资料: BAT 大厂最新面试题+答案合集(持续更新中) 来获取一份详细的大厂面试资料 为你的跳槽加薪多一份保障。