返回

iOS 底层原理:类的加载原理下(分类)

IOS

前言

在上一篇《iOS 底层原理:类的加载原理》中,我们探索了懒加载类与非懒加载类的区别,涉及了 rw、ro 的操作、方法列表排序的操作等。今天,我们将继续探索分类加载的原理。

准备工作

为了方便理解,我们首先需要准备以下资源:

  • objc4-818.2 源码

分类加载原理

分类定义

分类是 Objective-C 中一种强大的特性,允许我们在不修改原始类的情况下为其添加方法和属性。分类可以被看作是类的扩展,它可以为类添加新的功能,而无需修改类的源代码。

分类实现

分类的实现非常简单,只需要创建一个新的类,并将其声明为原始类的子类即可。例如,以下代码创建一个名为 MyCategory 的分类,为 NSString 类添加了一个名为 reverse 的方法:

@interface NSString (MyCategory)

- (NSString *)reverse;

@end

分类方法的调用

当我们调用分类方法时,编译器会自动将分类方法添加到类的实例方法列表中。这意味着我们可以像调用普通方法一样调用分类方法。例如,以下代码调用 NSString 类中的 reverse 方法:

NSString *string = @"Hello, world!";
NSString *reversedString = [string reverse];

分类属性的访问

分类也可以为类添加属性。分类属性与普通属性类似,但它们只能在分类中访问。例如,以下代码为 NSString 类添加一个名为 length 的属性:

@interface NSString (MyCategory)

@property (nonatomic, readonly) NSUInteger length;

@end

运行时机制

分类加载的运行时机制非常复杂,这里我们只简单介绍一下。

当一个分类被加载时,系统会创建一个新的类,并将这个类添加到原始类的元类中。这个新类被称为分类类,它继承自原始类。分类类中包含了分类方法和分类属性。

当我们调用一个分类方法时,系统会先在分类类中查找这个方法。如果在分类类中找到了这个方法,则直接调用这个方法。如果在分类类中没有找到这个方法,则系统会继续在原始类中查找这个方法。

分类属性的访问与分类方法的调用类似。系统会先在分类类中查找这个属性。如果在分类类中找到了这个属性,则直接访问这个属性。如果在分类类中没有找到这个属性,则系统会继续在原始类中查找这个属性。

总结

分类是 Objective-C 中一种强大的特性,允许我们在不修改原始类的情况下为其添加方法和属性。分类的加载过程非常复杂,但我们可以通过理解分类的定义、分类的实现、分类方法的调用和分类属性的访问来掌握分类加载的原理。