分类 category:可以给某一个类扩充一些方法 (不修改原来类的代码) 声明 : @interface 类名(分类名称) @end 实现 : @implementation 类名(分类名称) @end 使用注意: 1.分类只能增加方法,不能增加成员变量 2.分类方法实现中可以访问原类中声明的成员变量 3.分类可以重新实现原来类中的方法,但会覆盖掉原来的方法,会导致原来的方法没法再使用 4.方法调用优先级:分类( 最后参与编译的类优先)——》原来的类——》父类 给NSString 添加一个类方法:计算某字符串中阿拉伯数字的个数 给NSString扩充对象方法:计算当前字符串的阿拉伯数字的个数@“abc4535klkl55” *非正式协议: 非正式协议通常定义为NSObject的类别(分类)。 所谓非正式协议就是分类,即凡是NSObject或其子类Foundation框架中的类增加的分类都是非正式协议 如:NSString+Number 非正式协议 Person+run 普通分类 *类的延展 延展类别又称延展(Extendsion) 延展是分类的一个特例:其名字为匿名(空),并且新添加的方法一定要给予实现(不实现编译报错,分类没有这个限制,因为类扩展是在编译阶段被添加到类中,而类别是在运行时添加到类中),而且可以增加成员变量 (分类中不可以) //一般放入.m文件中,使方法相对私有 @interface Person (){ //类扩展 float _weight; } - run();//相对私有(私有:只可在实现中访问,开放方法实现中[self 私有方法]) @end 这种写法的类别叫匿名类别,又叫类扩展,所谓的扩展,其实就是为一个类添加额外的原来没有的变量、方法或者合成属性 //不能使用@implementation Person()实现类扩展,需要在原来类@implememtation Person 中实现 //给NSString增加一个Number分类计算字符串中阿拉伯数字的数量 #import < Foundation/Foundation.h> #import “NSString + Number.h” //创建一个Number分类 //声明类方法和对象方法 @interface NSString (Number) + (int)numberCountOfString:(NSString *)str; -(int)numberCount; @end //实现对象方法和类方法 @implementation NSString (Number) //对象方法 - (int)numberCount { int count = 0; //循环控制 for (int i = 0; i<self.length; i++) { //取出字符串中的每一个字符 unichar c = [self characterAtIndex:i]; //判断是否为阿拉伯数字 if( c>=‘0’&& c<=‘9’) {//如果是则计数器加1 count ++; } } //循环结束后返回计数器 return count; } //类方法 + (int)numberCountOfString:(NSString *)str { int count = 0; //循环控制 for (int i = 0; i<str.length; i++) { //取出字符串中的每一个字符 unichar c = [str characterAtIndex:i ]; //判断是否为阿拉伯数字 if( c>=‘0’&& c<=‘9’) {//如果是则计数器加1 count ++; } } //循环结束后返回计数器 return count; //可以调用对象方法实现,性能更高 //return [str numberCount]; } @end int main() { int count = [NSString numberCountOfString:@“abc43456bb”]; NSLog(@“%d”,count); int count1 = [@“abc4535klkl55” numberCount]; NSLog(@“%d”, count1); return 0; }
|