简介
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比较核心的开源库,但是这些库包含了很多高质量的思想,源码学习的时候一定要关注每个框架解决的核心问题是什么,以及它们的优缺点,这才能算真正理解和吸收。
-
AFN
-
SDWebImage
-
JSPatch、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上刷刷题。
-
深搜广搜
-
二叉树相关操作
-
字符串处理
-
链表
-
栈&队列
-
八大排序算法
-
基本的动态规划题、贪心算法、二分查找