定义:类别是可以通过不使用继承而为现有类添加新方法的一种机制
思考:为什么苹果添加这种完全可以通过继承来实现的机制呢?是性能上的考虑亦或是使用上的便利?对于这个疑问,思考很久,个人觉得从性能上来讲类别并不见得比继承要好,仅仅是使用上的便利而已。比如说我想为某个类(NSString)添加一个方法用于检测该类对象是不是用我需数据:
分类实现:
//NSString+Test.h
@interface NSString(Test)
-(BOOL)testDate;
@end
//NSString+Test.m
@implement NSString(Test)
-(BOOL)testDate{
...
}
@end
使用的时候:
#import"NSString+Test.h"
NSString *str = [[NSString alloc] initWithString: &"abc"];
BOOL bRet = [str testDate];
分类的优缺点:
优点:
1. 改动少
使用的时候还是通过NSString对象,非常方便。想象一下,如果项目中需要添加testDate这个功能,而你通过继承去实现(myString),将NSString替换为myString,整个工程都被改花了!
2.回调方便
待续。。。
3.并发操作方便
待续。。。
争议和缺点:
至于说分类将不同的功能分散到不同的文件,我觉得这并不是优点,因为分类的相互覆盖问题:如分类方法和本类方法冲突,本类的方法会被覆盖,且如果同一个类的不同分类之间如果方法名有冲突,那就可以产生奇怪的问题(被别人覆盖或是覆盖被人),所以如果你的添加到分类的方法没有执行或是功能和你实现的不一样,很有可能是被别人的覆盖了!至于分类不能添加变量,那就是没有争议的缺点了。
分类的使用惯例:
1. 扩展的类是系统自带的,使用分类。
2. 扩展的类是自定义的使用继承。
当然这只是习惯,没有所谓的硬性规定,觉得那个顺手就用那样好了。