一些遇到的面试题

81 阅读3分钟

总结下遇到的面试题

Block为什么用copy,使用场景和注意事项

block创建的时候在栈上,在栈的话我们控制不了释放的时机,去调用的话可能崩溃,所以用copy拷贝到堆上,由我们程序员来控制block的释放.block一般用来回调传值,注意事项是循环使用

元类的好处

复用消息发送机制,保证不同调用类型的方法都走一套流程 objc_msgSend 方法执行的逻辑是:先获取对象对应类的信息,再获取方法的缓存,根据方法的 selector 查找函数指针,经过异常错误处理后,最后跳到对应函数的实现。 属性和实例方法放在类对象,类方法放在元类对象.msg_send函数的是通过消息接受者的isa指针去找对应方法(sel)的实现,实例对象的话就去类找,类就去找元类,这样的机制其实是一套的,但如果没有的话,msg_send就需要多加判断,来区分方法是类方法还是实例方法,接收者是类对象还是实例对象,无法复用

ro,rw,rwe

  • class_ro_t是在编译的时候生成的。当类在编译的时候,类的属性,实例方法,协议这些内容就存 在class_ro_t这个结构体里面了,这是一块纯净的内存空间,不允许被修改。
  • class_rw_t是在运行的时候生成的,类一经使用就会变成class_rw_t,它会先将class_ro_t的内 容"拿"过去,然后再将当前类的分类的这些属性、方法等拷⻉到class_rw_t里面。它是可读写的。
  • class_rw_ext_t可以减少内存的消耗。苹果在wwdc2020里面说过,只有大约10%左右的类需要动 态修改。所以只有10%左右的类里面需要生成class_rw_ext_t这个结构体。这样的话,可以节约很 大一部分内存。

UITableView重用机制

有一个缓存池,每当用户滑动的时候,滑出屏幕的cell就放在缓存池去,key为cell注册的ID,当一个cell即将出现时,也通过注册好的id去缓存池找,找不到就新建一个.

类簇的优缺点

类簇其实是工厂模式的一种应用,通过一个公共抽象类暴露出去,这样入口就很集中.

NSOperation GCD的区别

GCD基于C语言写的,更快更高效,NSOperation是在GCD上面更高的一个抽象,如果是自定义任务,就NSOperation; NSOperation可以设置依赖关系,GCD不能

APP启动过程

  • main() 函数执行前
    dyld 1.加载.O文件;
    2.加载动态链接库,进行rebase指针调整和bind符号绑定;
    3.runtime的初始化,类和category的注册; 4.初始化,load方法
    ,加载c++静态全局变量 **这个阶段可以优化的点有尽量少使用动态库,load方法尽量少重写调用,(一次是4毫秒的小号),控制C++全局变量
  • main() 函数执行后;从main函数执行,到设置self.window.rootViewController执行完成(首屏渲染)
  • 首屏渲染完成后。从self.rootVC的创建完成后和didfinishLunch方法结束 libffi 这个框架可以实现hook C语言
  • 加载动态库,包括系统framework,以及一些libxxx的库,比如runtime的运行库:libobjc,运行GCD的库:libdispatch()。具体如下,找到动态库mach-o文件,打开验证文件,注册文件,调用里面的启动函数;dylb(动态链接器)把动态库加载到内存后,就