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

一、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. 类扩展中声明的方法没被实现,编译器会报警,但是分类中的方法没被实现编译器是不会有任何警告的。这是因为类扩展是在编译阶段被添加到类中,而分类是在运行时添加到类中


阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页