iOS 底层原理:类的加载原理下(分类)
2024-01-10 14:00:52
前言
在上一篇《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 中一种强大的特性,允许我们在不修改原始类的情况下为其添加方法和属性。分类的加载过程非常复杂,但我们可以通过理解分类的定义、分类的实现、分类方法的调用和分类属性的访问来掌握分类加载的原理。