当前位置:

首页 > 编程开发 > 解析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 方法做到彼此独立,别互相依赖,这样既安全又省心。

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 IOS软件
    相关文章 更多
    漫蛙漫画最新网址链接进入
    漫蛙漫画最新网址链接进入

    漫蛙漫画官网全解析:资源、体验与稳定性深度评测 “漫蛙漫画最新网址是什么?”“官方的在线观看入口在哪里?”——最近,这类问题在漫画爱好者圈子里可谓不绝于耳。别急,2025年最新、最稳的官方访问途径,这就为你一一道来。 官网入口直通车:https://www.manwamh.top 平台资源覆盖广度

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

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

    Windows
    Windows

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

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。