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. 类扩展中声明的方法没被实现,编译器会报警,但是分类中的方法没被实现编译器是不会有任何警告的。这是因为类扩展是在编译阶段被添加到类中,而分类是在运行时添加到类中。
上一篇: ios 适配开启个人热点视图偏移
下一篇: SQL数据库字段数据类型详细说明