欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS分类和类扩展的基本使用

程序员文章站 2022-05-07 15:06:38
一、Category Category:分类(类别、类目), 是Objective-C 的语法,顾名思义就是将一个类分成多个模块 Objective-C Runtime源码...

一、Category

Category:分类(类别、类目), 是Objective-C 的语法,顾名思义就是将一个类分成多个模块

Objective-C Runtime源码

typedef struct objc_category *Category;

struct objc_category {
	char *category_name;                          //分类名
	char *class_name;                             //分类所属的类名
	struct objc_method_list *instance_methods;    //实例方法列表
 	struct objc_method_list *class_methods;       //类方法列表
 	struct objc_protocol_list *protocols;         //分类实现的协议
};

根据源码可以看出, 这个分类结构体主要是给原有类添加方法的,而且结构体里也没有属性列表,所有原则上讲它只能添加方法, 不能添加属性

分类的语法格式:

@interface 待分类的类名(分类的名称)
@end

@implementation 待分类的类名(分类的名称)
@end

分类的作用:

1.将臃肿的类分为多个模块,方便管理
2.扩展一个类,给原来的类添加方法,特别是扩展系统自带的类或一些第三方框架
其中为系统的类写的分类也叫非正式协议

注意:
1.分类只能增加方法,不能增加属性
2.分类中的可以写@property, 但不会生成setter/getter方法
3.分类中可以访问原来类中的成员变量,但是只能访问@protect和@public形式的变量。如果想要访问本类中的私有变量,分类和子类一样,只能通过方法来访问。
4.如果分类中有和原有类同名的方法, 会优先调用分类中的方法, 就是说会忽略原有类的方法。
5.如果多个分类中都有和原有类中同名的方法, 那么调用该方法的时候执行谁由编译器决定,编译器会执行最后一个参与编译的分类中的方法。
可以在 TARGETS->Build Phases ->Compile Sources 修改(注意执行顺序是从上到下的)

二、Extension

Extension(类扩展)是Category的一个特例
特殊之处:
a.类扩展没有名字
b.只有声明没有实现,和原有的共享一个实现

类扩展格语法格式:

@interface 特扩展的类 ()
@end
作用:为一个类添加额外的原来没有变量,方法和属性
一般的类扩展写到.m文件中

一般的私有属性写到.m文件中的类扩展中

三、分类和类扩展的区别

1. 分类有名字,类扩展没有名字,是一个匿名的分类
2. 每一个分类都有单独的声明和实现,而类扩展只有声明,没有实现
3. 分类中只能新增方法,而类扩展不仅可以增加方法(必须实现),还可以增加实例变量(属性),该实例变量默认是@private类型的(用范围只能在自身类,而不是子类或其他地方)

4. 类扩展中声明的方法没被实现,编译器会报警,但是分类中的方法没被实现编译器是不会有任何警告的。这是因为类扩展是在编译阶段被添加到类中,而分类是在运行时添加到类中。