分类category :也叫类别,可以动态的为某个类增加一些方法,拓展这个类,能够方便团队开发,分类可以在你即使不知道一个类的源码的情况下,也可以向这个类添加扩展的方法,但是分类无法向类中添加新的成员变量,分类没有位置容纳成员变量(可以使用字典对象解决);
1:分类声明
//声明
@interface 类名<分类名称>
@end
//实现
@implemention 类名(分类名称)
@end
2:分类创建 NewFile-Objective-C File - Category
在Person中添加扩展方法run ,扩展类名称为:action
Person+action.h
#import "Person.h"
@interface Person (action)
-(void)run;
@end
Person+action.m
#import "Person+action.h"
@implementation Person (action)
-(void)run{
NSLog(@"某人跑了起来。。。");
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Person+action.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p =[[Person alloc]init];
[p run];
}
return 0;
}
注意:如果Category增加的方法如果与类的方法同名,会覆盖原类中的方法,因为Category具有更高的优先级;例如Person.m 中有run方法:
#import "Person.h"
@implementation Person
-(void)run{
NSLog(@"跑跑");
}
@end
代码执行情况为:
3:也可以向系统固有的数据类型进行动态添加方法:比如向NSString的方法中添加计阿拉伯数字个数的方法;
Nsstring+Number.m
#import "NSString+Number.h"
@implementation NSString (Number)
-(int)numberOfWords{
int count =0;
/*
不建议这样写,i=self.length 每次都会调用get方法,增加系统开销,所以将其提取出来
for(int i=0;i<self.length;i++)
*/
long len = self.length;
for(int i=0;i<len;i++)
{
//获取i位置对应的字符
char c = [self characterAtIndex:i];
if(c>='0' && c<='9')
{
count ++;
}
}
return count;
}
@end
main.m
#import <Foundation/Foundation.h>
#import "Person+action.h"
#import "NSString+Number.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p =[[Person alloc]init];
[p run];
NSString *str =@"1234546dksjfkdfj";
int num = [str numberOfWords];
NSLog(@"字符串中数字的个数为%d",num);
}
return 0;
}
代码运行情况:
注意:Category 中的方法必须声明并且实现,如果不声明,编译器将会报错(和类扩展不同)
比如在Nsstring+Number.h 中没有声明numberOfwords方法,编译器会报如下错误: