天天看点

分类 & 类扩展(category / extension)

1.分类(category)

1.1 分类存在的原因:在不破坏当前类的前提下给它添加方法,如果分类中重写了当前类的方法那么将优先使用分类中的方法

1.2 分类的好处:

  • 1.1中的原因就说明了一个好处:当需要扩展的类实际上是一个系统类或者第三方类时,如果希望给他及他的所有子类都增加功能,则可使用类别。比如NSString。
  • 可以将一个大类按照功能或其他方面分开声明和实现,便于扩展跟维护
  • 重写原来类中的方法

    1.3 语法格式

//声明   .h里
@interface UIView (rect)
@end

//实现   .m里
#import "UIView+rect.h"
@implementation UIView (rect)
@end
           

1.4 注意事项

在分类中不能添加成员变量 报错如下

分类 & 类扩展(category / extension)

你可能要问了 下面的origin 不也是成员变量吗,怎么他没有报错呢。

说明:在一个类中如果像这样@property声明一个变量,他会自动生成_origin成员变量,以及这个变量的setter和getter方法。setter和getter方法通过点语法获取这里不多做说明;而在分类中,他并不会自动生成_origin变量、setter或getter方法,如果要使用就要自己手动实现setter&getter方法,这样就能通过点语法获取,但是依然没有_origin变量,_origin不能直接使用,如果使用将会报错。

2 类扩展(extension)

1.1 扩展是分类的一种特殊形式,又叫匿名分类

1.2 语法格式 (有两种)

//单独文件下
#import"ViewController.h"

@interface ViewController ()
@property(nonatomic, copy)NSString *extension;
- (void)testExtension;
@end

//2.在当前类的.m中
#import"ViewController.h"
@interface ViewController ()
@property(nonatomic, copy)NSString *extension;
- (void)testExtension;
@end

@implementation ViewController
- (void)testExtension {
   self.stringExtension = @"testExtension";
   self.extension = @"extension";
}
@end
           

3.category & extension的比较

分类是不可以声明实例变量,通常是公开的,文件名是:主类名+分类名.h

扩展是可以声明实例变量,通茶是私有的,文件名为:主类名_扩展标识.h,在主类的.m文件中#import该头文件

继续阅读