OC语言类的深入和分类
一、分类
(一)分类的基本知识
概念:Category 分类是OC特有的语言,依赖于类。
分类的作用:在不改变原来的类内容的基础上,为类增加一些方法.
添加一个分类:
文件构图
在分类中添加一个方法:
Study方法的实现
测试程序
(二)分类的使用注意
1>分类只能增加方法(包括类方法和对象方法),不能增加成员变量
2>在分类方法的实现中可以访问原来类中的成员变量
3>分类中可以重新实现原来类中的方法,但是会覆盖掉原来的方法,导致原来的方法无法再使用(警告)
4>方法调用的优先级:分类>原来的类>父类,若包含有多个分类,则最后参与编译的分类优先
5>在很多的情况下,往往是给系统自带的类添加分类,如NSObject和NSString,因为有的时候,系统类可能并不能满足我们的要求
6>在大规模的应用中,通常把相应的功能写成一个分类,对原有类进行扩充,一般分模块写,一个模块一个分类
(三)分类变成练习
1>给NSString类增加一个类方法,计算某个字符串对象中阿拉伯数字的个数
2>给NSString类增加一个对象方法,计算该字符串中阿拉伯数字的个数
分析:遍历字符串,截取字符判断其是否在0~9之间
结构图:
分类中方法的声明:
#import <Foundation/Foundation.h> @interface NSString (NumberOfStr) /** * 声明一个类方法,计算字符串中阿拉伯数字的个数 * * @param str 字符串 * * @return */ +(int)NumberOfStr:(NSString *)str; /** * 声明一个对象方法,计算该字符串中阿拉伯数字的个数 * * @return */ -(int)NumberOfStr2; @end
分类中方法的实现
#import "NSString+NumberOfStr.h" @implementation NSString (NumberOfStr) #pragma mark - 计算一个字符串中阿拉伯数字的个数的类方法 +(int)NumberOfStr:(NSString *)str{ //遍历字符串,截取字符判断其是否在0~9之间 int count=0; for(int i=0;i<str.length;i++){ //取出字符串i位置的字符 char c=[str characterAtIndex:i]; //判断c是否在0~9之间,注意这里c是字符,需要使用单引号 if(c>'0' && c<'9'){ count++; } } return count; } #pragma mark - 计算一个字符串中阿拉伯数字的个数的对象方法 -(int)NumberOfStr2{ //遍历字符串,截取字符判断其是否在0~9之间 int count=0; for (int i=0;i<self.length; i++) { //取出字符串i位置的字符 char c=[self characterAtIndex:i]; ////判断c是否在0~9之间,注意这里c是字符,需要使用单引号 if (c>='0' && c<='9') { count++; } } return count; } @end
主程序测试
#import <Foundation/Foundation.h> #import "NSString+NumberOfStr.h" int main(int argc, const char * argv[]) { @autoreleasepool { //调用分类中实现的类方法 int count=[NSString NumberOfStr:@"你1好2世3界4"]; NSLog(@"%d",count); //调用分类中实现的对象方法 int count1=[@"0你1好2世3界4" NumberOfStr2]; NSLog(@"%d",count1); } return 0; }
二、类的深入研究
(一)类的本质
1>类本身也是一个对象,是class类型的对象,简称"类对象".
2>class类型的定义:
Typedef struct obj class *class;
类名就代表着类对象,每个类只有一个类对象
利用class创建Person类
利用Person创建Person类型的对象
Person *p=[[Person alloc] init];
3>获取内存中的类对象有两种方法:
class c=[p class]; //指向类的对象的指针调用class方法
class c1=[Person class]; //使用类名调用class方法
注意:c跟c1打印出来的地址相同,可以证明所有的对象共用一个类方法.