适用范围
- 当你已经封装好了一个类(也可能是系统类、第三方库),不想在改动这个类了,可是随着程序功能的增加需要在类中增加一个方法,这时我们不必修改主类,只需要给你原来的类增加一个分类。
- 将一个大型的类拆分成不同的分类,在不同分类中实现类别声明的方法,这样可以将一个类的实现写到多个.m文件中,方便管理和协同开发。
- 分类中的方法可以只声明,不实现,所以在协议不支持可选方法的时候(协议现在已经支持可选方法),通常把分类作为非正式协议使用。
定义
- 类别是类的补丁,不能修改类内部源码,却又希望添加新的功能时使用
- 只要保证类别名称唯一,就可以向一个类中添加任何数量的类别。
语法/具体使用
新建类别文件的命名:“原来类名+补充”
eg: NSString+SayHello
//.h头文件
@interface NSString (HelloWord,HelloWord2)
//不可以定义成员属性
@end
//.m实现文件
@implementation NSString (HelloWord,HelloWord2)
@end
类别缺陷
-
类别只能添加方法,不能添加成员变量
可以在类别中添加属性,但必须是@dynamic类型的。写了属性后也不会在类中自动添加成员变量,好处是可以通过点表达式来访问setter和getter方法。 - 当类别中的方法与现有的方法重名时,类别中的方法具有更高的优先级。
功能
- 使用类别为一个类的“隐藏方法”添加声明(向前引用)
如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会再产生警告 - 分散一个大型的类
#pragma mark- UI相关 用注释的方式管理方法,来自C语言
- 创建非正式协议 ,委托
补充: 类扩展
类扩展是类别的一种特殊形式
语法格式
@interface 主类类名()//类扩展类别不需要命名
@end
- 扩展通常定义在主类.m文件中,扩展中声明的方法直接在主类.m文件中实现。
- 扩展中可以声明实例变量,可以声明属性
- 因为扩展通常定义在主类的.m文件中,所以扩展声明的方法和属性通常是私有的。
类别和类扩展的区别
- 分类不可以声明实例变量,通常是公开的,文件名是:主类名+分类名.h
- 类扩展是可以声明实例变量的,是私有的,文件名是:主类名_扩展标识.h,在主类的.m文件中#import该头文件
使用方法
定义 Person类的扩展
- 方式一:以单独的文件定义
“Person_ExtensionWork.h”文件:
#import"Person.h"
@interface Person ()
@property(nonatomic, copy)NSString *stringExtension;
- (void)testExtension;
@end
-
方式二:在主类的.m文件中定义(推荐)
“Person.m”文件:
#import"Person.h"
@interface Person ()
@property(nonatomic, copy)NSString *stringExtension;
- (void)testExtension;
@end
@implementation Person
- (void)testExtension {
self.stringExtension = @"给扩展里面定义的属性字符串赋值";
NSLog(@"定义的属性String是:%@", self.stringExtension);
}
@end
网友评论