OC 分类(Category)与类扩展(Extension)

4,238 阅读1分钟

分类(Category)

  • 在.h文件中声明类别

    • 1)新添加的方法必须写在 @interface 与 @end之间

    • 2)ClassName 现有类的类名(要为哪个类扩展方法)

    • 3)CategoryName 待声明的类别名称

    • 4)NewMethod 新添加的方法

      @interface ClassName (CategoryName)
      NewMethod; //在类别中添加方法
      //不允许在类别中添加变量
      @end
      

注意: 1)分类只能增加方法, 不能增加成员变量

2)分类中写property只会生成getter/setter方法声明

3)分类可以访问原来类中的成员变量

4)如果分类和原来类出现同名的方法, 优先调用分类中的方法, 原来类中的方法会被忽略

  • 方法调用的优先级(从高到低)

    • 分类(最后参与编译的分类优先)
    • 原来类
    • 父类

5)多个分类中有同名方法,则执行最后编译的文件方法(注意开发中千万不要这么干)

  • 在.m文件中实现类别:

    • 1)新方法的实现必须写在@ implementation与@end之间
    • 2)ClassName 现有类的类名
    • 3)CategoryName 待声明的类别名称
    • 4)NewMethod 新添加的方法的实现
@implementation ClassName(CategoryName)

NewMethod
... ...
@end
  • 运用
#import "NSString+NJ.h"

@implementation NSString (NJ)

-(int)count{
    int number=0;

    for (int i= 0; i< self.length; ++i) {
    //self在对象方法就是当前调用该方法的对象
        unichar c=[self characterAtIndex:i];
        if(c>='0'&& c<='0');
        number ++;
    }
}
@end

//main.m
NSString *str=@"fds64jkl43fjdslkf";
int count =[NSString countWithStr:str];

类扩展(Class Extension)

  • 延展类别又称为扩展(Extendsion),Extension是Category的一个特例

  • 可以为某个类扩充一些私有的成员变量和方法

    • 写在.m文件中
@interface 类名 ()
@end
  • 对比分类, 就少了一个分类名称,因此也有人称它为”匿名分类”