Skip to content

Catagory/Extension

AnimenzzzKJ edited this page Sep 26, 2019 · 1 revision

Category 分类

可以动态的为已经存在的类添加新的行为

@interface MyClass (HelloWorld)  
-(void)HelloWorld;  
@end
 
@implementation MyClass (HelloWorld)  
-(void)HelloWorld{  
     NSLog(@"你好 伦敦奥运!");  
}  
@end

Category能实现上面的需求,当然也有使用Category是需要注意的问题:

  • Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。
  • Category可以重载原始类的方法,不大不推荐这么做,这样会覆盖掉原始类的方法。如果确实要重载,那就通过继承创建子类来实现。
  • 和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。

Extension扩展

所谓的扩展,其实为一个类添加额外的方法或者属性,这些方法和属性是私有的。而我们又常常把Extension成为匿名的Category。类扩展是在.m文件中声明私有方法非常好的方式。

在.m中写

#import Person.h
 
//定义一个Extension;
@interface Person ()
//对于普通变量,不能使用strong,retain,copy,只能使用assign;
@property(nonatomic,assign) int age;
 
//这是可以理解为private 类型的方法;只可以在该类@implementation内部调用;对外部不可见;
- (void)printName;
- (void)printAge;
 
@end

Category类别和Extension扩展的区别:

  • 从某个类新建一个Category,会生成类名称+Category名称.h和类名称+Category名称.m两个文件;而从某个类新建一个Extension,只会生成一个类名称_Extension.h一个文件。
  • Category中不可以定义属性或者变量;而Extension中可以定义属性或者变量。
  • 在Category中定义的方法可以被子类继承;而Extension中定义的方法和属性不能被子类继承,因为它们是private的。
  • Category可以对自定义的类或者framework框架中的类增加方法;而Extension只能对自定义的类进行增加方法,因为你无法在框架类的实现文件中实现这些增加的方法,毕竟OC不是开源的,这些代码不可见。
  • Category的名字是@interface 类名(Category名称),@implementation 类名(Category名称);而Extension名字只有@interface 类名();
  • 可以把Extension理解为特殊的Category;