OC底层原理总结(开篇)

1,042 阅读6分钟

自2015年进入到iOS开发行列中来,已经6年有余,一直以来作为一个UI仔定义自己,平时也没注意学习积累,只知道有个需求来了,我想办法去实现,不管low不low,先实现了再说。也没咋研究过底层的东西,所以,自己就是个井底之蛙。也没有总结过自己的博客,也没有在GitHub中传过自己的代码,在这个竞争日趋激烈的环境中,随着年龄的增大,感觉自己已经完全的失去了竞争力。真的是那句话,只是一年的经验,重复了7年。近期由于个人的原因,又离职了,感觉自己也需要准备一段时间来总结一下自己的知识,也算给自己搞一个备忘录,以便在后续的面试中来尽快的恢复面试状态。今天就来一个开篇索引,将自己能想到的东西先罗列一下。如果有时间,要对知识做一个框架联系类的梳理,这样可能对于记忆,对于理解都会有很大的帮助。

OC底层的基石

  • 对象、类对象、元类对象以及他们之间的关系
    
    这个是很多知识最最重要的基础,举例来说alloc/dealloc的程序调用栈,对于对象的操作需要对对象结构有足够的了解,这样才会明白为什么会调用这个函数,这个函数是用来干什么的。再比如说runtime中,对于对象的操作(属性的获取,方法的获取等)、方法hook等也是基于对对象的操作,操作的是对象的哪部分内容。还有就是方法调用底层objc_msgSend,消息转发机制中,如何通过SEL来找到对应的IMP也需要对对象的内部结构有足够了解。KVO,KVC,category等知识,也是跟对象息息相关的。还有非常重要的内容就是BLock的底层,也是跟对象息息相关,所以对象是贯穿整个底层探索过程以及知识体系的。一定一定要掌握好关于对象的知识。我也在想,这个系列的博客,对象要穿插在整个系列中,然后再系列的最后再做一个总结。
  • runtime
    
    关于runtime,这个自不必多说,OC是一门动态性非常强的语言,而实现动态性,就是靠runtime来实现的。runtime就是那些不常用的底层黑魔法。OC的消息转发机制、方法替换、方法交换、KVO等,都是靠runtime来实现的,在runtime章节中会再进行更深层次的描述。runtime强大,但是还是要在项目中实际应用起来,如果只是了解到它的强大,这是远远不够的,这次整理,我也有意会去找一个常用的,好用的runtime使用案例,自己动手实践一下(摊手.jpg,其实我也只是了解,并没有太多的实践)。
  • runloop
    
    关于runloop,相信很多人跟runtime有同样的感觉,也是一个非常偏向于底层的东西,实际开发中,接触的比较少。在此,我说一下我的拙见,runloop是一种节省资源的解决方案,能够使CPU在有事件时处理事件,无事件时休眠,也就是从内核态到用户态,或者从用户态到内核态的切换。同时也是主线程的runloop一直启动着,保证应用不退出。这个也是很多知识点的基础,包括但不限于NSTimer、线程保活、CADisplayLink、自动释放池AutoreleasePool等。所以,这个也是非常重要的知识。

OC底层中基于基石知识点

写到一半,发现很多知识点在上述文中已经提到了,其实,也无非就是那些东西,在此,我就在废话一点,把他们在罗列一遍(坑啊,原来写博客不是一件简单的事情,写流水账简单,写好的,难!)。这些也囊括了面试中80%以上的知识。这样吧,我就在知识点后面列点常考的面试题吧,然后在后续相关的文章中去回答这个面试题(所以此篇文章可能会时不时的更改,毕竟,自己埋的坑不一定要跳进去,还可以偷偷的填平)。

  • OC对象相关的知识
    a、OC对象、类对象、元类对象的关系
    b、ISA指针是干嘛用的?
    c、平时使用的关键字有哪些?weak的实现原理
    d、知道Nonpointer吗?
    e、delloc都干了啥?
    f、自动引用计数是如何运转的?
    g、class_rw_tclass_ro_t的区别
    h、等等等等,太多了
  • KVO
    a、KVO的实现原理?
    b、KVO的手动调用?
  • KVC
    a、KVC底层调用方法都有啥?
    b、在实际开发中用到过吗?怎么用的?
  • Category和Extention
    a、Category和Extention区别?
    b、Category的实现原理?
    b、Category能给类增加属性吗?不能的话,可以怎么添加?
  • Block
    a、说一下你对于block的理解?
    b、说一下block的变量捕获机制,为什么会有这种机制?
    c、block都有几种类型,他们之间的关系是啥?
    d、说一下使用block使用的注意事项,关键字?
    e、有没有碰到过循环引用的问题?如何规避?知道NSProxy吗?如果自己实现一个中间对象,什么思路?
       跟NSproxy有什么区别?
    f、先列举这些吧,太多了,累了。
  • runtime
    a、说一下你对于runtime的理解?
    b、runtime都能干什么?你自己用它干过啥?
    c、讲一下OC的消息转发机制
    d、什么是method swizzing
    e、runtime是如何通过selector找到对应的IMP地址的
    f、太多了,累了
  • 多线程
    a、多线程有几种实现方式?各自有什么区别?
    b、多读单写如何实现
    c、队列与线程的关系
    d、多个异步多线程请求,如何在请求全部完成后再进行统一处理?
    e、知道NSTimer可能出现的问题吗?如何解决问题?
    f、用GCD封装一个timer,什么思路?
    g、累了
  • runloop
    a、runloop是个啥概念?
    b、runloop有几种事件要处理,有几种运行模式,有几个阶段?分别说一下
    c、自动释放池的原理了解吗?它是在什么时候释放的?
    d、当用户点击个button的时候,runloop都干了什么?可能会引出响应链、传递链这些问题
    e、如何保持一个线程不退出
    f、performSelector afterDelay相关的问题
    

上述知识点未完待续,休息一下,等着想起来再来更新。

好了。上面就是我写的关于OC底层原理总结系列的开篇了,接下来就是进入到具体的知识环节了,希望自己这次能够认认真真的总结一遍,把这个系列当做一个备忘录,每次面试,拿来看一看,顺利拿下更多的offer。 以上得思~