------- android培训、java培训、期待与您交流! ----------
1,类别作用
在不修改原油的类的基础上增加新的方法
一个庞大的类可以分模块开发
一个庞大的类可以由多个人来编写,更有利于团队合作。
2,使用类别的目的:
1) 对现有类进行扩张:比如,你在类别中增加的方法会被子类所继承,在运行时跟其他的方法没由区别
2) 作为子类的替代手段,不需要定义和使用一个子类,你可以通过类别直接向已有的类里增加方法
3) 对象中的方法归类,利用category把一个庞大的类划分成小块来分别进行开发,从而更好的对类中的方法进行更新和维护
3,声明和实现一个类别
Person+Job.h
@interface Person (Job)
-(void)dancer;
@end
Person+Job.m
@implementation Person (Job)
-(void)dancer{
NSLog(@"dancer");
}
@end
Q:我看到老师的讲义上job是小写,不知道为什么不用大写?
A:等我看视频,看老师有没有回答大写小写,然后才能回答
注:a,不可以在类别里增加成员变量,但可以访问原来类中的成员变量
b,如果分类和原来的类出现重名的方法,优先调用分类中的方法,原来的方法会被忽略。
Q:为什么优先调用分类中的方法?
A:
c当多个分类中有同名方法,则执行最后编译的文件方法
Q:同名时调用最后编译的文件方法,是因为在代码区中最后编译的方法能够被优先找到吗?(像栈一样,先进后出的结构)
A:
Category 的非正式协议
非正式协议就是给NSObject类创建类目(分类)又叫做非正式协议,非正式协议一般不需要进行实现,一般在子类中进行方法重写。
统计一个字符串中阿拉伯数字的个数
NSString+count.h文件
#import <Foundation/Foundation.h>
@interface NSString (count)
-(int)countNum;
@end
NSString+count.m文件
#import "NSString+count.h"
@implementation NSString (count)
-(int)countNum{
int count = 0;
for(int i=0;i<self.length;i++){
unichar c = [self characterAtIndex:i];
if(c>='0'&& c<='9'){
count++;
}
}
NSLog(@"count =%d",count);
return count;
}
@end
main文件
#import "NSString+count.h"
@implementation NSString (count)
-(int)countNum{
int count = 0;
for(int i=0;i<self.length;i++){
unichar c = [self characterAtIndex:i];
if(c>='0'&& c<='9'){
count++;
}
}
NSLog(@"count =%d",count);
return count;
}
@end
分类延展
延展类别又称为扩展,Extension 是Category的一个特例,其名字为空(匿名),并且新增加的方法一定要实现
目的:通过延展来实现方法的私有,延展的头文件独立。
方法私有:
1)在扩张中声明,在.m中实现(此非完全私有,因为如果引用扩展的头文件,对象依旧可以调用扩展里的方法)
2)在.m中实现声明和方法
3)在.m中直接实现方法而不在@interface里声明