当前位置:

首页 > 编程开发 > 解析Objective-C 中 `+load` 方法的执行顺序

解析Objective-C 中 `+load` 方法的执行顺序

Objective-C中的+load方法在类或分类加载时自动触发,执行顺序遵循先父类后子类、先类后分类的原则。父类的+load先于子类执行,分类的+load在其所属类之后执行,但同一层级多个分类的执行顺序不确定。

理解 Objective-C 中 +load 方法的执行顺序

先说说 +load 方法:它是在类或分类被加载到内存时自动触发的一个类方法。调用时机非常早——早到程序刚启动、还没创建任何实例的时候。对于需要提前做初始化工作的场景来说,理解它的执行顺序至关重要,否则很容易埋下难以排查的坑。下面就来详细拆解一下,在类、子类和分类中,+load 到底按什么顺序跑。

解析Objective-C 中 `+load` 方法的执行顺序

+load 方法的基本介绍

+load+initialize 经常被搞混,但区别很明显:+load 在类或分类加载进内存时立即执行,且只调用一次;而 +initialize 是第一次给类发消息时才触发。所以,+load 适合做“一次性静态初始化”,比如注册一些全局配置或数据结构。

类和子类中的执行顺序

当父类和子类都实现了 +load 时,规则很明确:

  • 父类的 +load 一定先于子类的 +load 执行。
  • 同一继承链上的类,按编译器编译顺序依次调用。

举个例子就很清楚了:

#import 
@interface SuperClass : NSObject
@end
@implementation SuperClass
+ (void)load {
    NSLog(@"SuperClass +load");
}
@end
@interface SubClass : SuperClass
@end
@implementation SubClass
+ (void)load {
    NSLog(@"SubClass +load");
}
@end
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        // 程序启动时自动调用 `+load` 方法
    }
    return 0;
}

运行结果:

SuperClass +load
SubClass +load

父类先跑,子类后跑,符合直觉。

分类中的执行顺序

分类的加入让事情复杂了一点点:

  • 分类的 +load 在它所属类的 +load 之后执行。
  • 但同一个类如果有多个分类,这些分类之间的 +load 执行顺序 —— 不确定。换句话说,不要指望分类的加载顺序有任何保障,那是运行时决定的,可能因为编译顺序、链接顺序等因素变化。

接上面代码,给 SubClass 加两个分类:

输出结果可能是:

SuperClass +load
SubClass +load
SubClass (Category1) +load
SubClass (Category2) +load

也可能是:

SuperClass +load
SubClass +load
SubClass (Category2) +load
SubClass (Category1) +load

两种都有可能,千万别依赖分类的调用顺序来写业务逻辑。

父类分类的执行顺序

如果父类也有分类实现了 +load,完整的层级顺序如下:

父类的 +load → 父类分类的 +load(顺序不定)→ 子类的 +load → 子类分类的 +load(顺序不定)。

看一个例子,给 SuperClass 加个分类:

@interface SuperClass (Category)
@end
@implementation SuperClass (Category)
+ (void)load {
    NSLog(@"SuperClass (Category) +load");
}
@end

结合前面的代码,输出结果会是:

SuperClass +load
SuperClass (Category) +load
SubClass +load
SubClass (Category1) +load
SubClass (Category2) +load

可以看到,父类的分类夹在父类和子类之间,而子类分类排在最后。这个顺序是稳定的——除了同一级别分类内部的不确定性。

总结下来就一句话:+load 的执行顺序本质上遵循“先父类后子类、先类后分类”的原则,但同一层级的分支(多个分类)顺序不可控。写代码时最好让 +load 方法做到彼此独立,别互相依赖,这样既安全又省心。

本文内容来源于互联网,如有侵权请联系删除。
作者最新文章
编程开发 IOS软件
相关文章 更多
在 iOS 27 的“信息”应用中 苹果新增了一个“绘图”选项
在 iOS 27 的“信息”应用中 苹果新增了一个“绘图”选项

iOS27信息应用新增绘图选项,点击加号图标即可调用,并完整集成标记工具集。macOS27在备忘录和无边记应用中也加入了标记工具。目前两系统处于开发者测试阶段,正式版预计9月推送。

iOS 27全面强化横屏支持,为折叠屏设备铺路
iOS 27全面强化横屏支持,为折叠屏设备铺路

iOS27大幅扩展横屏支持,覆盖设置、相册、邮件等更多系统应用与核心功能,信息应用可折叠侧边栏,实时活动也完美适配横屏,同时优化键盘布局与通知中心显示,旨在为折叠屏等大屏设备优化交互体验与多任务效率。

iOS 27为锁定屏幕带来五大交互与视觉升级 支持AI创作个性化背景
iOS 27为锁定屏幕带来五大交互与视觉升级 支持AI创作个性化背景

iOS27锁屏迎来五大升级:扩展显示自动延展照片边缘;精简时钟模式将时间移至顶部;ImagePlayground支持自然语言生成AI壁纸;LiquidGlass新增透明度滑块,灵活调节视觉层次;Siri交互界面聚焦灵动岛,体验更直观。

苹果今日发布iOS 27首个开发者测试版 意外曝光折叠屏
苹果今日发布iOS 27首个开发者测试版 意外曝光折叠屏

iOS27首个开发者测试版代码中出现折叠状态、折叠角度及屏幕数量查询接口,证实苹果正为折叠屏设备进行系统层适配。该功能消失于iOS26,支撑折叠识别、UI自适应与跨屏调度,预计秋季发布首款折叠屏旗舰机型。

苹果发布超250项更新细节 不止iOS 27系统和AI
苹果发布超250项更新细节 不止iOS 27系统和AI

苹果WWDC2026发布iOS27等五大系统,超250项功能更新,涵盖通信、交互、影像、健康等领域,涉及同号互通、界面优化等。开发者测试版已开放,预计9月正式推送。

苹果iOS 27版Find My升级新增位置共享时长控制及液态玻璃界面设计
苹果iOS 27版Find My升级新增位置共享时长控制及液态玻璃界面设计

iOS27版FindMy新增位置共享时长控制,支持自定义时长或截止日期,并加入静默暂停功能,对方无通知但显示“未找到位置”。界面采用液态玻璃设计,标签栏统一,物品标签换用AirTag风格图标。

苹果发布 iOS 27 更新新增信息应用绘图工具
苹果发布 iOS 27 更新新增信息应用绘图工具

苹果在iOS27和macOS27系统中,为信息应用新增了绘图工具,并将Markup标注功能整合进聊天窗口,支持用户可以在图片和文档上即兴画写标注。此外,macOS27的备忘录和Freeform应用也同步获得该支持,并伴随多项人工智能功能升级。

苹果 iOS 27 改进中文输入更精准的候选词和汉字拆字输入优化
苹果 iOS 27 改进中文输入更精准的候选词和汉字拆字输入优化

iOS27首个Beta版本优化简体中文输入,结合上下文提供更精准候选词,减少选词错误;新增汉字拆字输入功能,输入组成部分拼音即可查找生僻字;同时主动提供标点符号建议,提升日常输入体验。

苹果发布 iOS/iPadOS 26.6 开发者预览版 Beta 2
苹果发布 iOS/iPadOS 26.6 开发者预览版 Beta 2

苹果推送iOS/iPadOS26.6开发者预览版Beta2,版本号23G5043d,距上次发布20天。公开测试版需注册AppleBeta计划后升级,开发者预览版需登录开发者计划后接收推送。

初探苹果 iOS 27 系统“查找”App:支持隐藏共享位置、自定义共享时长
初探苹果 iOS 27 系统“查找”App:支持隐藏共享位置、自定义共享时长

苹果iOS27系统“查找”App新增隐藏共享位置功能,启用后对方无通知,时长最长一天,也可精确自定义15分钟至30天。同时加入横屏模式,让操作更便捷,并增强隐私保护,用户可灵活控制位置共享。这一更新提升了用户隐私保护与使用灵活性。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

macOS软件
macOS软件

正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

Mac软件 更多
灵活计算器
灵活计算器
macOS/iOS/Android

灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

赤友清理大师
赤友清理大师
macOS

赤友清理大师是一款为 Mac 设计的智能清理优化工具,可精准扫描垃圾、大文件、重复文件等,释放磁盘空间。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

WINDOWS 更多
Windows 10
Windows 10
Windows

Windows 10 是一款微软推出的经典操作系统,拥有硬件兼容性与多任务处理能力。它更偏向把系统状态查看和常用调节动作放在一起,适合需要持续观察和微调设备状态的场景。

极度公式
极度公式
Windows/macOS/Linux

极度公式是一款跨平台专业LaTeX公式识别编辑软件,支持OCR公式识别和多平台编辑。和使用说明,避免使用,享受完整功能与稳定支持。做扫描整理、文字提取和表格转换时,它能把识别后的处理步骤接得更顺,资料录入这类场景会省下不少时间。

密码键盘
密码键盘
Windows/macOS/iOS/Android

密码键盘是一款兼具安全性与便捷性的高效密码管理器。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。