Category概念
官方文档解释:
您可以使用类别来定义现有类的其他方法(甚至是您的源代码不可用的类),而无需子类化。通常,您可以使用类别将方法添加到现有类中,例如Cocoa框架中定义的方法。所添加的方法由子类继承,并且在运行时与类的原始方法没有区别。您还可以使用自己的类的类别来:
将自己的类的实现分发到单独的源文件中-例如,您可以将一个大类的方法分为几个类别,然后将每个类别放入一个不同的文件中。
声明私有方法。
通过在类别名称下的接口文件中声明方法并在相同名称下的实现文件中定义方法,可以将方法添加到类中。类别名称表示方法是对在别处声明的类的扩展,而不是新的类。
以下为个人理解:
- 有些时候需要给类添加一些方法,却不希望子类继承此方法,则需要使用Category
- 给系统提供的类添加一些个人方法
Category创建方法
创建一个文件会出现以下界面,选择 Objective-C File, 如图
点击后会出现这个界面
File:创建的文件名
File Type:选择Category
Class:使用的类
创建好的文件名如图:
为使用的类+创建的文件名
Category的使用
在创建好的 .h文件里声明方法
#import "ViewController.h"
NS_ASSUME_NONNULL_BEGIN
@interface ViewController (change)
- (void)changeImage:(UIButton *)button;
@end
NS_ASSUME_NONNULL_END
在创建好的.m文件里写方法
#import "ViewController+change.h"
@implementation ViewController (change)
- (void)changeImage:(UIButton *)button {
UIImageView *changeImageView = [[UIImageView alloc] initWithImage: [UIImage imageNamed:@"yy.jpg"]];
[button.imageView addSubview:changeImageView];
changeImageView.frame = button.bounds;
}
@end
在要使用该方法的类的.m文件中引用该文件,然后使用
注意:是.m文件中,不然会报错
#import "ViewController.h"
#import "ViewController+change.h"
@interface ViewController ()
@end
@implementation ViewController
此处我例子为改变button的图片,在button点击事件中使用此方法
- (void)press:(UIButton *)button{
NSLog(@"按钮被按下") ;
[self changeImage:button];
}
点击button则改变图片
点击后:
Category注意事项
- 在文件中只能写方法不能含有属性,否则可以跑但是会崩
- 引用Category需要在.m文件中,否则会报错