1.类别的概念及作用
类别概念
Category有很多种翻译:分类 类别 类目
Category是OC特有的语法,其他语言没有的语法。
类别的作用
在不修改原有类的基础上增加新的方法
使用类别的目的
对现有类进行扩展:
比如,可以扩展Cocoa touch框架中的类,在类中增加的方法会被子类所继承,而且在运行时跟其他的方法没有区别。
作为子类的替代手段:
不需要定义和使用一个子类,可以通过类别直接向已有的类里增加方法
对类中的方法归类
利用categoty把一个庞大的类划分为小块分别进行开发,从而更好的对类中的方法进行更新和维护
2.使用类别的步骤
先声明类别---->实现类别----->使用类别
注意类别的命名规则:类名+扩展方法,如"NSString+countNum"
类别的接口声明与类的定义十分相似,但类别不继承父类,只需要带有一个括号,表明该类别的主要用途。
3.分类声明和实现
声明和实现一个类别
在.h文件中,声明类别:
@interface ClassName (CategoryName)
NewMethod;//在类别中添加方法
//不允许在类别中添加变量
@end
在.m文件中,实现类别:
@implementation ClassName(CategoryName)
@implementation ClassName(CategoryName)
NewMethod{
....
}
@end
也可以通过图形界面生成类别:
调用类别中的方法:
调用类别中的方法
与一般成员方法调用形式,完全一样
需要包含类别的文件
4分类使用注意事项
分类只能增加方法,不能增加成员变量,@property(可能编译不报错,但是运行有问题)
分类可以访问原来类中的成员变量
如果分类和原来类出现同名的方法,优先调用分类中的方法,原来类中的方法会被忽略
当多个分类中有同名方法,则执行最后编译的文件方法
5分类(Category)非正式协议
所谓的非正式协议就是类别,即凡给NSObject或其在Foundation框架中子类添加的类别,都是非正式协议。
例如:
@interface NSString (count)
- (void) countNum;
@end
@implementationNSString (count)
-(void)countStrNum{
intcount=0;
//遍历字符串
for(inti=0;i<self.length;i++){
//获取字符串的每一个字符
//获取字符串的每一个字符
unichar c = [selfcharacterAtIndex:i];
//判断是否是阿拉伯数字
if(c>='0'&& c<='9') {
//如果是阿拉伯数字,则+1
count++;
}
}
NSLog(@"count = %d",count);
}
-(void)countStrNum{
intcount=0;
//遍历字符串
for(inti=0;i<self.length;i++){
//获取字符串的每一个字符
//获取字符串的每一个字符
unichar c = [selfcharacterAtIndex:i];
//判断是否是阿拉伯数字
if(c>='0'&& c<='9') {
//如果是阿拉伯数字,则+1
count++;
}
}
NSLog(@"count = %d",count);
}
6 分类延展/扩展/延展/延展类别
类扩展的概念
类扩展Extension是类别Category的一个特例
类扩展的实现
@interface Person()
- (void) wrap;
int a;
@end
类扩展的特点
可以在延展中,定义实例变量
不能使用@implementation 类名() 实现类别的方法,直接在原有类的实现文件中实现方法.
可以定义私有变量和方法
7类别与类扩展的区别:
类别中只能增加方法,
类扩展中不仅可以增加方法,还可以增加实例变量,只是该实例变量默认是私有类型的(作用范围只能在自身类,而不是之类或其他地方)
类扩展中声明的方法没被实现,编译器会报错,但是类别中的方法没被实现编译器是不会报错的,这是因为类扩展是在编译阶段被添加到类中,而类别是在运行时添加到类中。
类扩展不能像类别那样拥有独立的实现部分,(@implementation),也就是,类扩展所声明的方法必须依托对应类的实现部分来实现
定义在.m文件中的类扩展方法为私有的,定义在.h文件中类扩展为公有的。类扩展是在.m文件中声明私有方法的非常好的方式。