load加载分析
内容提要
UIViewController+A 和 UIViewController+B 是两个实现了各自 load 方法的类别。load 方法的调用顺序取决于 Build Phases 中 Compile Sources 部分类的加载顺序。如果两个类别具有相同的方法名,则会调用最后加载的文件的方法。如果方法名不同,它们将不会相互影响。
延伸解读
编译顺序决定 load 调用次序
load 方法的调用顺序并非由运行时随机决定,而是取决于 Xcode 中 Build Phases 的 Compile Sources 列表里文件的排列顺序。示例中先输出 load B 再输出 load A,说明 B 文件在编译源文件中排在 A 之前。调整该列表顺序即可改变 load 的执行次序,这是理解后续方法覆盖现象的前提。
同名方法覆盖,异名方法共存
当两个分类实现同名方法(如 test)时,运行时只会调用最后加载的那个分类的实现,示例中最终执行的是 A 的 test。但这并不意味着整个文件被覆盖:分类中独有的方法(如 testA、testB)依然可以正常调用,输出 testA 和 testB。因此,影响仅限于同名方法,不同名方法互不干扰。
排查分类冲突的实用视角
如果项目中多个分类意外实现了相同方法,实际生效的往往是编译顺序靠后的那个,这可能导致调试时行为与预期不符。遇到分类方法表现异常时,可以检查 Compile Sources 的顺序,并确认是否有同名方法被其他分类覆盖。对于不同名方法,则无需担心被覆盖,可放心使用。
Q&A
UIViewController+A 和 UIViewController+B 的 load 方法有什么区别?
它们各自实现了自己的 load 方法,调用顺序取决于 Build Phases 中 Compile Sources 的加载顺序。
如果两个类别有相同的方法名,调用时会发生什么?
会调用最后加载的文件的方法,在例子中只会执行 A 的 test 方法。
如何确定 load 方法的执行顺序?
执行顺序取决于 Build Phases 中 Compile Sources 的类加载顺序。
不同的方法名之间会相互影响吗?
不会,只有相同的方法才会受到影响,不同的方法不会相互影响。
在示例代码中,load 方法的输出顺序是什么?
输出顺序是先执行 B 的 load 方法,然后执行 A 的 load 方法。
如果调用 testA 和 testB 方法,会有什么结果?
会分别输出 testA 和 testB,证明文件没有被覆盖。