2022面试题整理
2022面试题整理
字节跳动
自我介绍
之前项目的亮点,难点,擅长点
实例对象的内存结构?isa_t包含哪些信息
block内为什么要实现__strong?
Swift的方法调度是什么?跟OC的区别?如何强制用消息发送
Swift的写时复制底层如何实现?
进程,线程;串行,并行;同步,异步;并行,并发
进程是资源分配的最小单位,线程是CPU调度的最小单位
并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔发生。
并发的关键是你有处理多个任务的能力,不一定要同时。
并行的关键是你有同时处理多个任务的能力。
串行:一个程序执行没结束前,另一个不能开始,要一个一个的执行。
并行:一个程序执行没结束,另一个已经开始。
同步:当程序1调用程序2时,程序1停下不动,直到程序2完成回到程序1来,程序1才继续执行下去。
异步:当程序1调用程序2时,程序1径自继续自己的下一个动作,不受程序2的的影响。
APP启动流程,启动优化
字符串为什么用copy
属性特性内存管理上有哪些关键字
多线程
信号量semaphore初始信号量为0会发生什么?
组件化
使用过的设计模式
静态编译的流程
LinkMap是如何静态分析无用类的
runloop
runloop跟UI渲染有哪些关系
source0和source1都包含哪些东西
子线程是如何利用runloop进行线程保活的
如何hook C函数
上机题
编码
算法题
含有n个数字的圆圈中每次删除第m个元素,求最后剩下的数字
1 |
LRU算法原理,包含哪些数据结构
链表反转
BI安
栅栏函数的实现细节
京东
简述下KVC的处理流程,是否会触发KVO
启动优化方式
简述下TCP三次握手流程,为什么2次和4次不行?
阅读过哪些第三方源码?挑一个介绍一下?
AutoreleasePool的底层结构
@autoreleasepool{} 本质上是一个结构体:
autoreleasepool会被转换成__AtAutoreleasePool
__AtAutoreleasePool 里面有两个函数objc_autoreleasePoolPush(),objc_autoreleasePoolPop().,其实一些列下来之后实际上调用得是AutoreleasePoolPage类中得push 和 pop两个类方法
push就是压栈操作,
pop就是出栈操作于此同时对其对象发送release消息进行释放
算法
如何实现一个哈希表
快看漫画
load 和 initilze 的调用情况,以及子类的调用顺序问题?
initialize
这个方法是第一次给某给类发送消息的时候调用,并且只会调用一次。 如果某一个类一直没有被用到,此方法也不会执行。initialize
先初始化父类, 在初始化子类,子类的initialize 会覆盖父类的方法。
分类中实现了initialize
会覆盖本来的initialize方法,如果多个分类都执行了initialize ,那么只是执行最后编译的那个。
load当程序被加载的时候就会调用, 其加载顺序为, 如果子类实现类load 先执行父类 -> 在执行子类,而分类的在最后执行。
如果子类不实现load,父类的load就不会被执行。
load是线程安全的,其内部使用了锁,所以我们应该避免在load方法中线程阻塞。
load在分类中,重写了load方法, 不会影响其主类的方法。即不会覆盖本类的load方法
当有多个类的时候,每个类的load的执行顺序和编译顺序一致。