category
概念
category(分类)是Objective-C 2.0之后添加的语言特性,category的主要作用是为已经存在的类(即使在没有某个系统类源代码的情况下)动态添加方法。除此之外,apple还推荐了category的另外两个使用场景
- 可以把类的实现分开在几个不同的文件里面。这样做有几个显而易见的好处,a)可以减少单个文件的体积 b)可以把不同的功能组织到不同的category里 c)可以由多个开发者共同完成一个类 d)可以按需加载想要的category 等等。
- 声明私有方法
使用
创建一个分类后,生成一个.m文件和一个.h文件。在.h文件中声明分类方法,并在.m文件中实现。外界可以直接调用这个分类方法。
//为类 People 创建一个分类
//分类的.h 文件
#import "People.h"
@interface People (eat)
//声明分类方法
- (void)eat;
@end
//分类的.m文件
#import "People+eat.h"
@implementation People (eat)
//实现分类方法
- (void)eat{
NSLog(@"吃饭");
}
@end
extension
概念
- Extension(类扩展)是Category的一个特例,其名字为匿名(为空)。
- extension在编译期决议,它就是类的一部分,在编译期和头文件里的@interface以及实现文件里的@implement一起形成一个完整的类,它伴随类的产生而产生,亦随之一起消亡。extension一般用来隐藏类的私有信息,你必须有一个类的源码才能为一个类添加extension,所以你无法为系统的类比如NSString添加extension。
使用
创建一个类扩展后,生成一个.h文件,在.h文件中声明扩展方法,然后在类的.m文件中实现扩展方法。这个扩展方法是一个私有方法,外界不可以调用。
//为类 People 创建一个扩展
#import "People.h"
@interface People ()
//声明扩展方法
- (void)sleep;
@end
category 和 extension 的区别
- 相同点:都可以为一个类添加方法
- 不同点:
- 1、Categories在@implementation中不提供实现,编译器不会报错,运行调用时出错;Extensions在@implementation中不提供实现,编译器警告;
- 2、Category只能用于添加方法,不能用于添加成员变量。extension中声明的方法和添加的成员变量是私有的,只有主implement能调用,外部的类无法调用。
- 3、Category 增加的方法如果与类的方法同名,会覆盖原类的方法,因为Category的优先级更高!Extensions则会冲突报错。