Categories可以为一个对象添加方法而不需要增加该类的子类或者更改当前的对象。实际上Categories通常被用来为已经存在的类添加方法,比如你可以自己为
NSString
字符串类添加你自己的方法。Categories provide the ability to add functionality to an object without subclassing or changing the actual object. A handy tool, they are often used to add methods to existing classes, such as
NSString
or your own custom objects.
优点
- 提供一种简单的方式,将类的定义模块化到相关方法的组或分类中;
- 提供一种简单的方式,扩展现有类定义,不必访问类的源代码,也无须创建子类。
举例
Step1: 创建项目
启动Xcode -> File -> New -> Project. 然后创建一个 iOS Single View Applciation。这里我们命名为 Categories.
Step2: 创建Category
现在来创建一个Category来为NSString添加扩展方法。点击 File -> New -> File 然后选择 Cocoa Touch Objective-C category. 这里我们命名为 RemoveNum。记得要从 Category on 下拉框选择 NSString
,最后点击Create按钮旁的Next按钮。
声明Category扩展的方法。
选择 "NSString+RemoveNums.h"文件。添加以下代码:
@interface NSString (RemoveNums)//分类名放在圆括号中,为`RomoveNums`
- (NSString *)removeNumbersFromString:(NSString *)string;
@end
实现Category扩展的方法。
接着来到"NSString+RemoveNums.m"文件。添加以下代码。大家可以看到这个方法实际做的事情就是从整个NSString
去除掉所有的数字字符。
- (NSString *)removeNumbersFromString:(NSString *)string
{
NSString *trimmedString = nil;
NSCharacterSet *numbersSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
trimmedString = [string stringByTrimmingCharactersInSet:numbersSet];
return trimmedString;
}
Step3: 导入Category
在"ViewController.h"文件头部添加以下代码来导入Category
#import "NSString+RemoveNums.h"
Step4: 测试Category
在 ViewController.h 文件的viewDidLoad
方法中添加以下代码。
NSString *stringWithNums = @"ABC 123";
NSLog(@"stringWithNums --> %@",stringWithNums);
stringWithNums = [stringWithNums removeNumbersFromString:stringWithNums];
NSLog(@"trimmed stringWithNums --> %@",stringWithNums);
Step5: 使用Category的方法
在Xcode的菜单栏点击 Product -> Run,测试过程中,请注意控制台首先输出的ABC 123
,然后被方法去除数字后输出的ABC
。
关于Category的注意事项
- 分类可以覆写该类中的另一个方法,但是通常认为这种做法是拙劣的设计习惯。因为,覆写了一个方法后,再也不能访问原来的方法。如果确实需要覆写方法,正确的选择可能是创建子类。如果要在子类中覆写方法,仍然可以通过向super发送消息来引用父类的方法。因此不必了解要被覆写方法的复杂内容,就能够调用父类的方法,并向子类的方法添加自己的功能。
- 如果喜欢可以拥有许多分类,只要遵守此处指出的规则即可。如果一个方法定义在多个分类中,该语句不会指定使用哪个分类。
- 记住,通过使用分类添加新方法来扩展类不仅会影响这个类,同时也会影响所有他的子类。例如,如果为根对象NSObject添加新方法,就存在潜在的危险性,因为每个人都继承这些新的方法,无论你是否愿意。
- 通过分类为现有类添加新方法可能对你有用,但最好不要增加与该类的原始设计或意图不一致的方法。
- 对象/分类命名对必须是唯一的。但是,在给定的Objective-C名称空间中,只能存在一个NSString Name Utilities分类。
欢迎来我的个站逛逛: http://alexyu.me/