一.分类(Category)
1.适用范围
- 当我们需要给一个类(自定义类、系统类或第三方库)新增一个方法,并且不改动这个类,只需要给原来的类增加一个分类就可以实现。
- 在协同开发中,我们将一个类拆成多个分类,在分类中实现类别声明,可以将一个类的实现写到不同的.m文件中,方便管理和协同开发。
- 分类中的方法可以只声明,不实现。
2.格式
@interface 主类类名(分类类名)
//不可以定义成员属性
@end
@implementation 主类类名(分类类名)
@end
文件名通常为:主类名+分类名
调用方法时,只需要向主类引用发送消息即可。
3.注意
- 1.分类中方法的优先级比原来类中的方法高,也就是说,在分类中重写了原来类中的方法,那么分类中的方法会覆盖原来类中的方法
- 2.分类中只能声明方法,不能添加属性变量,在运行时分类中的方法与主类中的方法没有区别
- 3.通常来讲,分类定义在.h文件中,但也可以定义.m文件中,此时分类的方法就变成私有方法
4.使用范例
定义UIImage类的分类
"UIImage+Image.h"文件:
@interface UIImage (Image)
//给定一个图片名称,生成不会被渲染的图片
+ (instancetype)imageWithOriginalImageName:(NSString *)imageName;
@end
"UIImage+Image.m"文件:
#import "UIImage+Image.h"
@implementation UIImage (Image)
+ (instancetype)imageWithOriginalImageName:(NSString *)imageName
{
//修改图片渲染模式
UIImage *image = [UIImage imageNamed:imageName];
image = [image imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
return image;
}
@end
5.一般不能在分类(类别)中定义成员属性
- Category是Objective-C中常用的语法特性,可以很方便的为已有的类添加函数。但是Category不允许为已有的类添加新的属性或者成员变量。
- 常见的方法是通过runtime.h中objc_getAssociatedObject / objc_setAssociatedObject来访问和生成关联对象。通过这种方法来模拟生成属性。
二.类扩展(Extension)
1.适用范围
扩展是分类的一种特殊形式。
2.语法格式
@interface 主类类名()
@end
扩展通常定义在主类.m文件中,扩展中声明的方法直接在主类.m文件中实现。
3.注意
- 1.扩展中可以声明实例变量,可以声明属性
- 2.扩展声明的方法和属性通常是私有的,因为扩展通常定义在主类的.m文件中
4.分类和扩展的区别
- 1.分类是不可以声明实例变量,通常是公开的,文件名是:主类名+分类名.h
- 2.扩展是可以声明实例变量,是私有的,文件名为:主类名_扩展标识.h,在主类的.m文件中#import该头文件
5.使用范例
定义 RBTabBar类的扩展
- 方式1:以单独的文件定义 “RBTabBar_ExtensionTabBar.h”文件:
#import "RBTabBar.h"
@interface RBTabBar ()
@property (nonatomic, strong) UIButton *selectedBtn;
- (void)test;
@end
- 方式2:在主类的.m文件中定义,并且实现扩展定义的方法
“RBTabBar.m”文件:
#import "RBTabBar.h"
@interface RBTabBar ()
@property (nonatomic, strong) UIButton *selectedBtn;
- (void)test;
@end
@implementation RBTabBar
- (void)test
{
NSLog (@"这是一个类扩展方法");
}
@end
网友评论