一文读懂OC-Category(分类)详解,轻松实现方法重用!
2024-01-31 09:31:55
前言
在OC开发中,Category(分类)是一个非常重要的概念,它可以为已有的类添加新的方法,而无需修改原有类的源代码。这在很多场景下都非常有用,例如:
- 为系统类添加新的方法,例如为NSString添加一个方法来判断字符串是否包含另一个字符串。
- 为第三方库的类添加新的方法,例如为AFNetworking添加一个方法来支持自定义缓存策略。
- 为自己的类添加新的方法,而又不希望修改原有类的源代码。
Category的原理
Category的原理很简单,它实际上是利用了OC的动态特性。在OC中,方法的调用是通过消息发送机制实现的,也就是说,当我们调用一个方法时,实际上是向一个对象发送了一条消息,这个消息包含了方法的名称和参数。
Category的原理是,它为一个类动态地添加了一个新的方法,这个方法在原有类的源代码中并不存在。当我们调用这个方法时,OC会自动查找这个方法是否在该类的Category中存在,如果存在,则直接调用Category中的方法,否则,则会调用原有类中的方法。
Category的语法
Category的语法非常简单,它只需要在原有类的名称后面添加一个Category名称,然后在Category中定义新的方法即可。例如,以下代码为NSString添加了一个新的方法isContainsString:
,这个方法可以判断字符串是否包含另一个字符串:
@interface NSString (MyCategory)
- (BOOL)isContainsString:(NSString *)string;
@end
@implementation NSString (MyCategory)
- (BOOL)isContainsString:(NSString *)string {
return [self rangeOfString:string].location != NSNotFound;
}
@end
Category的使用
Category的使用也很简单,只需要在原有类的对象上调用Category中的方法即可。例如,以下代码使用NSString的isContainsString:
方法来判断字符串@"Hello, World!"
是否包含字符串@"World"
:
NSString *str = @"Hello, World!";
BOOL isContains = [str isContainsString:@"World"];
Category的优点
Category有以下几个优点:
- 可以为已有的类添加新的方法,而无需修改原有类的源代码。
- 可以方便地为第三方库的类添加新的方法,而无需修改第三方库的源代码。
- 可以为自己的类添加新的方法,而又不希望修改原有类的源代码。
- 可以提高代码的重用性,例如,我们可以将常用的方法封装成一个Category,然后在其他类中使用这个Category。
Category的缺点
Category也有以下几个缺点:
- 可能会导致代码难以理解,因为Category中的方法并不是在原有类的源代码中定义的,因此需要查看Category的源代码才能知道类中有哪些方法。
- 可能会导致冲突,因为Category中的方法可能会与原有类中的方法同名,如果同时调用这两个方法,则会产生冲突。
结论
Category是一个非常有用的OC特性,它可以为已有的类添加新的方法,而无需修改原有类的源代码。Category的使用非常简单,只需要在原有类的对象上调用Category中的方法即可。Category有以下几个优点:可以提高代码的重用性、可以方便地为第三方库的类添加新的方法、可以为自己的类添加新的方法,而又不希望修改原有类的源代码。Category也有以下几个缺点:可能会导致代码难以理解、可能会导致冲突。