二十一、app加载流程(五)类的实现和加载(下)

本文由快学吧个人写作,以任何形式转载请表明原文出处

一、资料准备

objc4-818.2

对应mac的版本是11.1。可根据自己的系统版本挑选可以进行调试的源码。

二、思路

  1. 上一章知道了非懒加载类是如何从一个镜像中加载到了内存中并且被实现,从而真正的被app使用到。
  2. 那懒加载的类呢?

三、懒加载类的加载实现

1. 懒加载类和非懒加载类的区别

懒加载类 : 在第一次调用的时候才完成实现和加载。

非懒加载类 : 在程序初始化的时候就进行了加载。

例如 : 在一个类的实现中写入一个+(void)load方法,哪怕+(void)load中什么都不写,这个类也会变成非懒加载类。

2. 懒加载类的实现

1. 创建一个懒加载类

既然懒加载类没有在最开始的程序初始化时进行加载,而是在第一次调用的时候完成加载,那么可以举例 :

  1. 在objc818.2中创建一个JDMan类,继承于NSObject。添加一些实例变量、属性和方法,但是不要在JDMan.m中写入+(void)load方法。
  1. 现在的JDMan是懒加载的,可以验证。进入到_objc_init(void)--->map_images--->map_images_nolock--->_read_images。找到非懒加载类的实现的for循环。在其中加入如下代码,获取mach-o静态段中保存的所有的非懒加载类 :

执行代码,会获得到mach-o中的非懒加载字段中的所有非懒加载类,在lldb中搜索:JDMan,是找不到的 :

证明JDMan不在可执行文件的非懒加载的表中,所以JDMan是懒加载类。

2. 懒加载类的实现

  1. main.m文件中实例化一个JDMan的实例 :
  1. JDMan这个懒加载类调用到alloc这个方法的时候,就是JDMan在被使用了,那么JDMan就需要被实现。

  2. JDMan调用alloc方法的本质是objc_magSend,这个之前说方法的本质的时候说过。既然是objc_msgSend,那么就会进行缓存查找或lookUpImpOrForwardJDMan是第一次被使用,所以缓存中必然是不存在alloc方法的缓存的,那么就会找到lookUpImpOrForward

  3. lookUpImpOrForward中是有检查类是否实现的,进入lookUpImpOrForward源码,如下图 :

  1. 但是,这里有一个问题,[JDMan alloc]这个是类在调用类方法,那么lookUpImpOrForward中的cls应该是JDMan元类,inst才是JDMan类。

  2. 先进入realizeAndInitializeIfNeeded_locked源码 :

  1. 一步一步的进入initializeAndLeaveLocked :
  1. 上面那一步注意,第一个参数传的是nonmeta,是JDMan类。一步一步的进入realizeClassMaybeSwiftAndUnlock :

3. 懒加载类的加载的结论 :

懒加载类是通过lookUpImpOrForward进入到的realizeClassWithoutSwift,在上一章已经说过realizeClassWithoutSwift是怎么实现一个类的,不再重复。

相关推荐
茶底世界之下2 天前
为什么预览、录制、离线导出不能共享同一个背压策略?
ios·swift
2501_916007472 天前
苹果商店iOS应用上架费用全面解析:开发者计划与审核费用计算
android·ios·小程序·https·uni-app·iphone·webview
2501_916008892 天前
如何实现iOS App代码混淆:SwiftShield使用指南
android·ios·小程序·https·uni-app·iphone·webview
2501_915909062 天前
移动端开发工具链怎么组合比较好,iOS、Android、跨端三套配置方案
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
2501_916008892 天前
怎么用 Godot 导出 iOS 应用并上架 App Store?签名字段该填什么?
android·ios·小程序·https·uni-app·iphone·webview
2501_915918412 天前
iOS编程用什么软件好?主流工具Xcode、AppCode、CodeRunner与新兴快蝎对比
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
终端安全笔记3 天前
iOS 27 之后「策略空转」:设备升级不报错,但旧策略不再管它
android·网络·安全·ios·智能手机
9765033353 天前
iOS 上架 4.3a 被拒【uniapp专讲】
flutter·ios·objective-c·uniapp·swift
黑化旺仔3 天前
【OC】KVO
macos·ios·objective-c·cocoa
HouWan3 天前
SwiftUI 小技巧:如何读取 SwiftUI Font 的详细信息
ios·swiftui·apple