iOS底层探索:类拓展和关联对象大揭秘
2023-10-12 23:08:28
我们已经探索了 iOS 中类和分类的加载。关于类这一块的内容,我们还有一些坑没有填,比如类拓展和关联对象。今天让我们一起填下这块的坑。关于类拓展的具体定义,大家可以直接参考 Apple 对于类拓展的说明。我们在 Xcode 中创建 Objective-C 类型的文件的时候,可以看到有四种类型可供选择:Class、Subclass of、Category、Protocol。其中 Category 就是我们常说的类拓展。
类拓展允许我们在不修改类源代码的情况下,为现有类添加新的方法、属性或其他特性。这对于扩展现有类的功能非常有用,特别是当我们不想修改原有代码或无法直接修改源代码的时候。
关联对象是一种机制,允许我们将任意数据与对象关联起来。这对于存储与对象相关的数据非常有用,比如我们在开发中经常用到的 KVC(Key-Value Coding)和 KVO(Key-Value Observing)就依赖于关联对象。
类拓展和关联对象都是 iOS 开发中非常重要的概念。掌握它们的使用可以帮助我们更深入地理解 iOS 底层的工作原理,并编写出更加健壮和灵活的代码。
现在,让我们分别来详细了解一下类拓展和关联对象。
类拓展
类拓展允许我们为现有类添加新的方法、属性或其他特性。这对于扩展现有类的功能非常有用,特别是当我们不想修改原有代码或无法直接修改源代码的时候。
要使用类拓展,我们需要在 .h 文件中声明拓展,并在 .m 文件中实现拓展中的方法。例如,以下代码为 NSString 类添加了一个新的方法 reverse:
@interface NSString (Reverse)
- (NSString *)reverse;
@end
@implementation NSString (Reverse)
- (NSString *)reverse {
NSMutableString *reversedString = [NSMutableString stringWithCapacity:[self length]];
for (NSInteger i = [self length] - 1; i >= 0; i--) {
[reversedString appendFormat:@"%C", [self characterAtIndex:i]];
}
return reversedString;
}
@end
在使用这个拓展时,我们可以像使用 NSString 的其他方法一样使用它:
NSString *string = @"Hello, world!";
NSString *reversedString = [string reverse];
NSLog(@"%@", reversedString); // 输出:"!dlrow ,olleH"
关联对象
关联对象是一种机制,允许我们将任意数据与对象关联起来。这对于存储与对象相关的数据非常有用,比如我们在开发中经常用到的 KVC(Key-Value Coding)和 KVO(Key-Value Observing)就依赖于关联对象。
要使用关联对象,我们需要使用 objc_setAssociatedObject() 函数将数据与对象关联起来,并使用 objc_getAssociatedObject() 函数获取与对象关联的数据。例如,以下代码将一个字符串与一个对象关联起来:
NSString *string = @"Hello, world!";
objc_setAssociatedObject(object, @"key", string, OBJC_ASSOCIATION_RETAIN);
要获取与对象关联的数据,我们可以使用以下代码:
NSString *string = objc_getAssociatedObject(object, @"key");
关联对象的使用非常广泛,比如我们在开发中经常用到的 KVC(Key-Value Coding)和 KVO(Key-Value Observing)就依赖于关联对象。KVC 和 KVO 可以让我们通过属性的 key 来访问和观察对象的属性,而不需要直接访问对象的属性。这对于简化代码和提高代码的可读性非常有用。
以上就是类拓展和关联对象的简单介绍。希望通过这篇文章,你能够对这两个概念有更加深入的了解。