首先先介绍一下category 和 extension的概念
分类(Category):
Category 是表示一个指向分类的结构体的指针。原则上它只能增加方法,不能增加成员(实例)变量。
使用场景:
☛ 可以减少单个文件的体积
☛ 可以把不同的功能组织到不同的category里
☛ 可以由多个开发者共同完成一个类
☛ 可以按需加载想要的category
☛ 声明私有方法
category原则上只能给某个已有的类扩充方法,不能扩充成员变量 (声明属性)
怎样生产一个category文件,这里就不做介绍了。
创建category文件后,会在项目里生成一个新的文件,为已有的类扩充方法。


注意事项:1.扩充的方法如果与待扩展类里的方法同名,则会有编译警告,而且运行时会优先调用扩展的方法。
2.当有两个或多个扩展类里都有同一个方法,则最后一个参与编译的方法会被调用。
3.扩展类里可以调用待扩展类里的属性
4.扩展类里如果添加了扩充变量,编译和运行都不会报错,但调用时候会报错
category 不能添加属性是因为在分类的指针结构体中,根本没有属性列表。所以在分类中用@property声明属性,既无法生成成员变量也无法生成setter/getter方法。
手动添加setter/getter:



不要忘记 #import "objc/runtime.h"
类扩展(extension):
Extension是Category的一个特例。类扩展与分类相比只少了分类的名称,不会创建新的文件。

特点:
☛ 不仅可以增加方法,还可以增加实例变量(或者属性),只是该实例变量默认是@private类型的, 用范围只能在自身类,而不是子类或其他地方
☛ 类扩展中声明的方法没被实现,编译器会报警,但是类别中的方法没被实现编译器是不会有任何警告的。这是因为类扩展是在编译阶段被添加到类中,而类别是在运行时添加到类中。
☛ 类扩展不能像类别那样拥有独立的实现部分(@implementation部分),也就是说,类扩展所声明的方法必须依托对应类的实现部分来实现。
☛ 定义在 .m 文件中的类扩展方法为私有的,定义在 .h 文件(头文件)中的类扩展方法为公有的。
extension 在Swift和OC中也是有区别的, 在Swift中特点:
∗ 添加计算实例属性和计算类型属性
∗ 定义实例方法和类型方法
∗ 提供新构造器
∗ 定义下标
∗ 定义和使用新的嵌套类型
∗ 使现有类型符合协议
扩展可以向类型添加新功能,但不能覆盖现有功能。添加方法与对应类的同名会报错
与OC不同的是,在Swift 的 extension 中 不可以直接添加属性。编译会报错

和oc一样,我们可以用关联方法来添加属性:


网友评论