黑马程序员——OC中的分类

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


简述:分类就是类的补充和扩展,本质上是类的一部分,把一个类分成若干部分,每个部分就是分类。可以在不改变原来类模型的前提下,给类扩充一些方法

一、分类的使用

分类的声明与实现

@interface 主类类名(分类类名)

分类的文件名为:主类名+分类名

//类的声明
@interface Class1:NSObject
{
 //成员变量
  int a;
  int b;
}
//对象方法
- (void)class1Test;
@end

 //分类
@interface Class1(test2)
//只能扩充方法,不能添加成员变量
- (void)class1Test2;
@end

 //分类的实现
@implementation Class1(test2)
- (void)class1Test
{
  NSLog(@"this is class1Test's content");
}
@end  

  //分类的具体使用
int main()  //程序的入口
{  
 //定义一个Class1 类c1
  Class1 *c1=[[Class1 alloc] init];  
 //使用分类扩充的对象方法
  [c1 class1Test]; 
 return 0;
}

二、分类的使用注意

1、分类只能增加方法(包括类方法和对象方法),不能增加成员变量,在分类中,不可以定义实例变量,也不可以定义属性,可以访问对象的属性;

2、在运行时,分类中的方法与类原有的方法并无区别,其代码可以访问包括私有类成员变量在内的所有成员变量;

3、若分类声明了与类中原有方法同名的函数,则分类中的方法会被调用。因此分类不仅可以增加类的方法,也可以代替原有的方法。这个特性可以用于修正原有代码中的错误,更可以从根本上改变程序中原有类的行为。若两个分类中的方法同名,则被调用的方法是不可预测的;

4、方法调用的优先级:分类->原来的类->父类,若包含有多个分类,则最后参与编译的分类优先;

5、在大规模的应用中,通常把相应的功能写成一个分类,可以有无限个分类,对原有类进行扩充,一般分模块写,一个模块一个分类。

//Class1的分类
@interface Class1(part1) 
 //若Class1类中有test1的声明和实现,会优先调用该分类的test1 
 - (void)test1;
@end

 @implementation Class1(part1)
- (void)test1
{ 
  NSLog(@"调用了分类中的test1方法");
}
@end

三、分类的练习

题目:给类NSString添加一个新方法,计算字符串中阿拉伯数字的个数

分析:

1.给系统类添加新方法,我们可以使用分类来对NSString扩充方法;

2.如何判断阿拉伯数字?可以通过计算改字符的值是不是在"0"和"9"之间;

3.遍历整个输入的字符串,对每个字符串检测是否在0-9范围内,如果是,则+1;

4.返回第三步获得的int值.

代码如下:

//NSString的分类
@interface NSString(numberNSString)
//声明类方法CountNum
+ (int)CountNum:(NSString *)str;
@end

 //分类的实现
@implementation NSString(numberNSString)
+ (int)CountNumber:(NSString *)str
{ 
   int result = 0;  //返回值
   //遍历字符串检查是否符合
   for(int i=0;i<[str length]);i++ 
  {
     //如果是数字,0-9之间 
    if(str[i]>'0' && str[i]<'9')  
        //数字计数器+1 
        result++;    
} 
 //返回结果
   return result;
}
@end


你可能感兴趣的:(OC语言基础)