一、类别:
类别(category)在使用中还是用的比较多的,用起来也很方便,特别是在为框架类进行拓展的时候,在不继承类的条件下给类添加方法!
实现格式(以为NSSing类添加一个方法为例):
@interface NSString(CNSString) //CNSString可以随便取,只要不和其他的类重名
-(BOOL)isURL;
@end
可能你会这样想,我通过继承也能做到啊,说得也有道理。但是如果仅仅是为了添加一个方法而继承一个类,这个开销是不划算的:比如说我想为NSString 类添加一个方法,用于判断字符串是不是一个url链接:
@implementation NSString(CSString)
-(BOOL)isURL{
return [self hasPrefix@"http://"];
}
@end
就成功的网类NSString里添加了isURL这个方法,使用的时候就:
NSString *str = @"http://www.baidu.com";
BOOL bRet = [str isURL];
非常的方便,但使用的时候也要注意它的缺点:
1. 不能往类中添加实例变量。
2. 新拓展的方法不要和已经存在的方法同名,否则已存在的方法会被扩展的方法覆盖(除非你故意为之)。
二、扩展
扩展(Extension):很多人说扩展是匿名的类别,我觉得这么说有点不妥,先看一下扩展的使用,
@interface NSString()
-(BOOL)isURL;
@end
乍看之下确实挺像,但在往下看,扩展也可以这么用
@interface NSString()@property(strong, nonatomic) NSArry;
@end
像类中添加了实例变量,这是违背类别的使用原则的!扩展在实际中一般用于在.m文件中定义类的私有变量和私有方法,一般用于自定义的类,不能像已存在的类添加方法或是变量,这是和类别在使用上的根本差异!