类别的作用
在不修改原有的类的基础上增加新的方法
一个庞大的类可以分模块开发
一个庞大的类可以由多个人来编写,更有利于团队合作
使用类别的目的
1)对现有类进行扩展:
可以扩展Cocoa touch框架中的类,在类别中增加的方法会被子类所继承,而且在运行时跟其他的方法没有区别。
2)作为子类的替代手段:不需要定义和使用一个子类,可以通过类别直接向已有的类里增加方法。
3)对类中的方法归类:利用category把一个庞大的类划分为小块来分别进行开发,从而更好的对类中的方法进行更新和维护。
在.h文件中,声明类别:
@interface ClassName (CategoryName)
NewMethod; //在类别中添加方法,不允许在类别中添加变量
@end
声明类别格式
1)新添加的方法必须写在 @interface 与@end之间
2)ClassName 现有类的类名(要为哪个类扩展方法)
3)CategoryName 待声明的类别名称
4)NewMethod 新添加的方法
在.m文件中(也可以在.h中实现),实现类别:
@implementation ClassName(CategoryName)
{
......
}
@end
实现类别格式
1)新方法的实现必须写在@ implementation与@end之间
2)ClassName 现有类的类名
3)CategoryName 待声明的类别名称
4)NewMethod 新添加的方法的实现
分类的使用注意事项
1)分类只能增加方法, 不能增加成员变量、@property(可能编译不报错,但是运行有问题
@interface Person (study)
@property int age;
-(void)study;
-(void)work;
@end
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Person+study.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [Person new];
[p eat];
[p run];
p.age = 10;
}
return 0;
}
如:
#import <Foundation/Foundation.h>
//原类
@interface Person : NSObject
{
@public
int _age;
}
@end
//类别
@implementation Person (study){
- (void)study{
NSLog(@"age = %d",_age);
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
//对象
Person *p = [Person new];
[p study];
}
return 0;
}
非正式协议
非正式协议就是给NSObject类创建的类目(分类)又叫做非正式协议, 非正式协议一般不需要进行实现,一般在子类中进行方法的重写。
统计一个字符串中阿拉伯数字的个数
NSString *str = @"ada12sfasdf1213234asfda 32424 121 aa11afdsf";
@interface NSString (count)
-(void)countStrNum;
@end
@implementation NSString (count)
-(void)countStrNum{
int count=0;
//遍历字符串
for(int i=0;i<self.length;i++){
//获取字符串的每一个字符
unichar c = [self characterAtIndex:i];//判断是否是阿拉伯数字
if (c>='0' && c<='9') {
//如果是阿拉伯数字,则+1
count++;}
}
NSLog(@"count = %d",count);}