ios 分类(Category)和扩展(Extention)

  • Category

一、what

Category其实指的是分类、类别
它的主要作用是在不改变原有类的前提下,动态地给这个类添加一些方法
是对装饰模式的一种具体实现

二、分类的使用
1、创建一个AppDelegate分类AppService

ios 分类(Category)和扩展(Extention)_第1张图片
新建文件

ios 分类(Category)和扩展(Extention)_第2张图片
创建分类
ios 分类(Category)和扩展(Extention)_第3张图片
创建成功
.h
#import "AppDelegate.h"

NS_ASSUME_NONNULL_BEGIN

@interface AppDelegate (AppService)

//初始化 window
-(void)initWindow;

//初始化用户系统
-(void)initTabBarViewController;

@end

NS_ASSUME_NONNULL_END




.m
#import "AppDelegate+AppService.h"
/**
 包含第三方 和 应用内业务的实现,减轻入口代码压力
 */
@implementation AppDelegate (AppService)

#pragma mark ————— 初始化window —————
-(void)initWindow{
   
}

#pragma mark ————— 初始化 TabBarViewController, 加载引导页

-(void)initTabBarViewController{


调用

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
   
    [self initWindow];
    [self initTabBarViewController];
    
    return YES;
}

三、优点

  • 声明私有方法
  • 分解体积庞大的类文件
  • 把Framework私有方法公开
  • 模拟多继承(另外可以模拟多继承的还有protocol)

四、分类特点

  • 1、分类中的可以写@property, 但不会生成setter/getter方法, 也不会生成实现以及私有的成员变量,会编译通过,但是引用变量会报错,原则上讲它只能添加方法,实际上可以通过其它方式添加属性
    因为分类的结构体指针中,没有属性列表,只有方法列表
  • 2、同名方法调用的优先级为 分类 > 本类 > 父类
  • 3、如果多个分类中都有和原有类中同名的方法, 那么调用该方法的时候执行谁由编译器决定;编译器会执行最后一个参与编译的分类中的方法。
  • 4、如果多个分类中都有和原有类中同名的方法, 那么调用该方法的时候执行谁由编译器决定;编译器会执行最后一个参与编译的分类中的方法。

五、深入探究
需要先了解runtime
Category源码

Category 是表示一个指向分类的结构体的指针,其定义如下:
typedef struct objc_category *Category;
struct objc_category {
  char *category_name                          OBJC2_UNAVAILABLE; // 分类名
  char *class_name                             OBJC2_UNAVAILABLE; // 分类所属的类名
  struct objc_method_list *instance_methods    OBJC2_UNAVAILABLE; // 实例方法列表
  struct objc_method_list *class_methods       OBJC2_UNAVAILABLE; // 类方法列表
  struct objc_protocol_list *protocols         OBJC2_UNAVAILABLE; // 分类所实现的协议列表
}


  • Extention
    一、what
    我们先来创建一个继承自UIViewController的类
.h
#import 

@interface YFBaseVC : UIViewController

@end

.m
#import "YFBaseVC.h"

@interface YFBaseVC ()

@end

@implementation YFBaseVC

- (void)viewDidLoad {
    [super viewDidLoad];
   
}
@end

创建一个继承自NSObject的类

.h
#import 

NS_ASSUME_NONNULL_BEGIN

@interface fq : NSObject

@end

NS_ASSUME_NONNULL_END

.m 
#import "fq.h"

@implementation fq

@end

有没有看出有什么区别?
我们可以看到多了一个在.h文件里多一个


ios 分类(Category)和扩展(Extention)_第4张图片
image.png

没错,这个就是类扩展,想想我们平时都在这个部分做了什么?
没错,就是添加私有属性和方法,而且添加的方法必须实现,不然会有warning。
二、怎么创建
和创建分类的方法一样,在后面选择Extention就好了,不过只会生成一个.h文件,没有.m文件,一般情况下会直接写在.m文件里,不会单独去创建一个.h文件。


ios 分类(Category)和扩展(Extention)_第5张图片
image.png


  • 分类、扩展区别
  • 原则上Category只增加方法,Extention不仅可以增加方法,还可以增加属性,并且方法必须实现。

你可能感兴趣的:(ios 分类(Category)和扩展(Extention))