本系列主要是看完MJ的OC底层原理课程所写的总结,希望自己能加深对iOS底层的了解。

OC的信息机制

OC中的方法调用其实都是转成objc_msgSend函数的调用,给receiver(方法调用者)发送了一条信息(selector方法名

objc_msgSend底层有3大阶段

  • 消息发送(当前类、父类中查找)

  • 动态方法解析
  • 消息转发

Runtime的应用

  • 查看私有成员变量
  • 字典转模型
    • 利用Runtime遍历所有的属性或者成员变量
    • 利用KVC设值
  • 替换方法实现
    • class_replaceMethod
    • method_exchangeImplementations
  • 实现多继承
    • 利用forwardingTargetForSelector把相应的调用消息传给一个静态代理进行处理

注意事项

  • 进行消息转发的话,不会进行消息的缓存,所以每次调用方法都会遍历所有的父子类方法列表,从而导致性能的损耗,而动态方法解析则会进行方法的缓存,所以跟正常的消息发送的性能一致

    • 尽量避免使用消息转发

转载于:https://juejin.im/post/5cbad4f8f265da038364c242

OC底层原理之Runtime相关推荐

  1. OC底层原理-Block

    对于block,在日常开发中经常会用到,但有时候会出现一些奇奇怪怪的问题,比如block的里面值没更新上,又比如block里面要改变一个外部变量的值,就得加上__block,不然编译器就会报错. 那么 ...

  2. OC底层原理-alloc流程

    alloc流程分析 可以通过opensource下载objc4来查看alloc的源码,这里用objc4-818版本来分析 1.alloc + (id)alloc {return _objc_rootA ...

  3. Runtime底层原理总结--反汇编分析消息转发

    消息转发:发送一个消息,也就是sel查找imp,当没有找到imp,接下来进入动态方法解析,如果开发者并没有处理,会进入消息转发. 消息转发 前几篇文章介绍了Runtime底层原理和动态方法解析总结 , ...

  4. Runtime底层原理--Runtime简介、函数注释

    Runtime官方文档介绍直通车 扩展:编译时 看到运行时就会想到编译时,编译时主要是将源代码翻译成可识别的机器语言,如果编译时类型检查等翻译过程中发现语法分析之类有错误会给出相应的提示.比如OC,s ...

  5. iOS底层原理总结 - OC对象的本质

    苹果官方文档 The Objective-C language defers as many decisions as it can from compile time and link time t ...

  6. 视频教程-iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-iOS

    iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化 小码哥教育CEO,曾开发了2个iOS的流行开源框架(MJRefresh.MJExtension),目前在国内的使用率非常高. 李 ...

  7. iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-李明杰-专题视频课程...

    iOS底层原理班(下)/OC对象/关联对象/多线程/内存管理/性能优化-236人已学习 课程介绍         得遇名师,突飞猛进!iOS培训王者MJ(李明杰)老师精心研发,iOS进阶课程,实用技术 ...

  8. iOS之深入解析Runtime的objc_msgSend“慢速查找”底层原理

    CacheLookup 快速查找 objc_msgSend 通过汇编 快速查找方法缓存 ,如果能找到则调用 TailCallCachedImp 直接将方法缓存起来然后进行调用,如果查找不到就跳到 Ch ...

  9. oc中block的本质及底层原理

    block的本质 block的种类及储存区域 __block的本质 block的循环引用 前言: 这里就不讨论block的具体写法及使用场景了,因为当你有一天想深入了解block 的底层原理时,你早已 ...

最新文章

  1. 【django】站点管理
  2. 如何处理 Windows Phone 8 动态砖变成黑白砖
  3. Queue 队列的用法
  4. java如何把string转化E_java将string转为代码执行
  5. sklearn应用—高斯混合
  6. 你是在用计算机算你的人生经历吗,计算机人生规划
  7. python替换img的路径为新的路径_以“五智”为核心 南宁电信打造5G时代数字家庭新路径...
  8. 混合云下割裂的Web安全管理挑战如何破?
  9. android包结构规范,【Android】Android产品-开发规范
  10. 【kafka】kafka 如何开启 kafka.consumer的监控指标项
  11. 电商优秀设计作品展示
  12. 何时运行 A/B 测试,亚马逊、微软、谷歌等大厂是怎么做的?
  13. 腾讯云区块链产品负责人邵兵:产业区块链刚刚起步,做好基础设施才有可能进入2.0阶段
  14. 浅析C++开发工程师的高薪就业方向
  15. 构建大数据平台的必要性
  16. VC++ DLL注入目标程序
  17. 优质编程网站推荐(适合学习和查资料)
  18. Layout inflation的正确使用
  19. Please define INSTALL4J_JAVA_HOME to point to a suitable JVM 的解决办法
  20. oracle 设置 锁模式,oracle表锁的几种模式v$locked_object-locked_mode

热门文章

  1. SignalR的另类实现技巧
  2. Python包安装小技巧
  3. Google Container Engine进军生产环境,容器技术势不可挡
  4. 【吾日三省吾身】2015.5.24-涅槃行动第六天
  5. 一个很好的Qt教程个人主页
  6. 【转】做正确的事情,等着被开除(Do the right thing, Wait to get fired)
  7. MySQL5.7安装步骤
  8. Git中.gitignore忽略文件(maven项目)
  9. Centos7:Docker私有仓库搭建和使用
  10. Fedora26 tftp-server设置