写在前面

关于load方法我相信大家应该有所了解。这篇文章主要目的是记录我在看 ObjC源码时对于load方法的一些新的认知,所以在这篇文章里面会粘贴部分关键的 ObjC源码。

+ load 是 Objective-C 中的一个方法,它是一个在整个文件被加载到运行时,在 main 函数调用之前被 ObjC 运行时调用的方法。

这篇文章会介绍+ load方法的三个问题:

  1. + load方法是如何被调用的。

  2. + load方法的调用顺序。

  3. + load方法的作用。

load方法是如何被调用的

我们可以很清楚的看到,在+load方法之前,被调用的方法有:

1 call_class_loads()2 call_load_methods3 load_images4 dyld::notifySingle(dyld_image_states, ImageLoader const*)11 _dyld_start

(滑动显示更多)

dyld 是 the dynamic link editor 的缩写,它是苹果的动态链接器。

在我们启动App时,真正的加载过程是从exec()函数开始,系统会调用exec()函数创建进程,并且分配内存空间。然后会执行以下的操作

  1. 把App对应的可执行文件加载到内存。

  2. 把dyld加载到内存。dyld也是一个可执行的程序。

  3. dyld进行动态链接。

dyld的具体工作内容:

  1. dyld会找到可执行文件的依赖动态库。接着dyld会将所依赖的动态库加载到内存中。这是一个递归的过程,依赖的动态库可能还会依赖别的动态库,所以dyld会递归每个动态库,直至所有的依赖库都被加载完毕。

  2. Rebase和Binding。

每当有新的镜像加载之后,都会执行 3 load_images 方法进行回调,这里的回调是在整个运行时初始化时 _objc_init 注册的。

关于镜像的概念:

Mach-O 是 iOS 系统不同运行时期可执行的文件的文件类型统称。

Mach-O 有三种文件类型: Executable、Dylib、Bundle。

Executable:app 的二进制主文件,同时也是 app extension 的二进制主文件。

Dylib:动态库。

Bundle:资源文件包。

镜像文件包含了上述的三种文件类型。

看到load_images方法

首先会调用 prepare_load_methods 对 load 方法的调用进行准备。

prepare_load_methods方法的作用:

递归地加载当前类和没有调用+ load 父类进入加载列表,在将当前类加入加载列表之前,会先把父类加入待加载的列表,保证父类在子类前调用 load 方法。

然后开始调用call_load_methods方法。

其中 call_class_loads 会从一个待加载的类列表 loadable_classes 中寻找对应的类,然后找到 @selector(load) 的实现并执行。

这个时候就执行了[XXX load]方法了。

load方法的调用顺序

  1. 当父类和子类都实现load函数时,父类的load方法执行顺序要优先于子类

  2. 当一个类未实现load方法时,不会调用父类load方法

  3. 类中的load方法执行顺序要优先于类别(Category)

  4. 当有多个类别(Category)都实现了load方法,这几个load方法都会执行,但执行顺序不确定(其执行顺序与类别在Compile Sources中出现的顺序一致)

  5. 有多个不同的类的时候,每个类load 执行顺序与其在Compile Sources出现的顺序一致

load方法的作用

在main运行之前,load 方法就会调用。

由于它的调用不是惰性的,且其只会在程序调用期间调用一次,最最重要的是,如果在类与分类中都实现了 load 方法,它们都会被调用,不像其它的在分类中实现的方法会被覆盖,这就使 load 方法成为了方法交换(Method Swizzling)的绝佳时机。

load方法注意:

load调用时机比较早,当load调用时,其他类可能还没加载完成,运行环境不安全,不过在这个时间点,所有的 framework 都已经加载到了运行时中,所以调用 framework 中的方法都是安全的。

load方法是线程安全的,它使用了锁,我们应该避免线程阻塞在load方法。

嗨,这里是逻辑iOS技术号:一个让知识变得感性,让学习变得轻松!活跃的技术小站,希望给你的生活与技术带来意思不一样!关注公众号,回复“   面试题”,即可领取更多大厂面试题型哦~ 小逻辑相信我们的生活不止眼前的苟且,还有我们向往的诗和大厂高薪工作~

对于load方法的理解相关推荐

  1. (转)jquery基础教程八 load方法及小技巧

    首先我们看看手册上的描述 load(url, params, callback) 装入一个远程HTML内容到一个DOM结点. 注意:避免用装入的scripts脚本,装入脚本改用$.getScript. ...

  2. Objetive-C +load方法研究

    load方法的执行时机 Objetive-C 的runtime会在一个类的所有方法加载到内存中时调用这个类的+load() 方法,因为每个类的方法只是加载一次,所以每个+load()方法只调用一次. ...

  3. Hibernate中get方法和load方法的区别

    一.get和load方法都是根据id去获得对应数据的,但是获得机制不同:如果使用get方法,hibernate会去确认该id对应的数据是否存在,它首先会去session中去查询(session缓存其实 ...

  4. 23.使用load()方法异步请求数据

    使用load()方法通过Ajax请求加载服务器中的数据,并把返回的数据放置到指定的元素中,它的调用格式为: load(url,[data],[callback]) 参数url为加载服务器地址,可选项d ...

  5. Load 方法 暨 程序的加载顺序

    前言 众所周知,App 的入口是 main 函数,而在此之前,我们了解到的是系统会自动调用 load 方法.而且是先调用父类的,再是自己的,最后才是分类的.而为什么是这样呢,不清楚. 下面所有的 lo ...

  6. 1-jQuery - AJAX load() 方法【基础篇】

    jQuery load() 方法是简单但强大的 AJAX 方法:load() 方法从服务器加载数据,并把返回的数据放入被选元素中. 格式 $(selector).load(URL 源码 index.h ...

  7. 使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题

    使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题 参考文章: (1)使用jquery的load方法设计动态加载,并解决被加载页面JavaScript失效问题 ( ...

  8. hibernateTemplate的load方法

    hibernateTemplate的load方法采用延迟加载,所以应当注意. 如果配置不当,采用此方法获取对象,往往会出现异常: javax.servlet.ServletException: org ...

  9. 032_jQuery Ajax的load方法

    1. load()方法通过AJAX请求从服务器加载数据, 并把返回的数据放置到指定的元素中. 2. 语法 $(selector).load(url,data,function(response,tex ...

最新文章

  1. 看完50多家阵亡的初创企业,我们发现了AI创业的5个行业潜规则
  2. 完成动态根据类别动态填充区域颜色
  3. Spring常见面试题(13个面试题,回答超详细)
  4. 安卓牛客专项练习2020.12.31
  5. Saltstack常用模块及API
  6. AsyncTask doinbackground onProgressUpdate onCancelled onPostExecute的基本使用
  7. 为什么你学了 N 遍 Spring Boot,至今还是学生项目?你的问题在这里 | 原力计划...
  8. UML类与类的关系, 总算理解了关联和依赖在实际中的区别
  9. MacOS系统下matplotlib中SimHei中文字体缺失报错的解决办法
  10. 根号2以及π的计算--关于无理数的畅想
  11. vue 批量下载图片并打包成压缩包
  12. (转)证券公司私募(PB)整体服务
  13. 怎么给当前计算机添加一个用户,电脑如何设置新用户 电脑创建新用户的方法...
  14. C语言printf()左对齐和右对齐
  15. I.MX6Q(TQIMX6Q/TQE9)学习笔记——新版BSP之LCD移植
  16. 【图像融合】基于非下采样剪切波变换(NSST)实现红外图像和可见光图像融合matlab代码
  17. 干货:英语四级阅读理解技巧
  18. 什么是事实,事实和理性思维
  19. windows10关闭安全中心服务器,微软:Windows 安全中心问题阻止 Win10 版本 2004 更新...
  20. 望远镜和相机是如何工作的

热门文章

  1. python实现轨迹回放_腾讯地图教你快速实现轨迹回放
  2. 怎么将txt文件转化为html格式的文件?--极为丑陋的方式
  3. 动态 obj 的 key 值设置 {key1:key1}
  4. 企业各职位英文缩写:
  5. z-index的属性
  6. cms 和 g1的主要区别
  7. ICRA 2023 | 第一届RoboDepth鲁棒深度估计竞赛
  8. 家庭网络、工作网络和公用网络 三种模式的区别
  9. unity抠人像原理_抠取复杂背景下人像头发丝的PS方法
  10. 实用推荐:分享一个极简实用的综合导航网站