iOS开发基础:类别(Category)与类扩展 (Extension)

一、类别(Categroy)

再将类别之前,先介绍一下为什么要使用类别。
在开发大型项目中,企业级开发中多人同时维护同一个类,此时程序员A因为某项需求只想给当前类添加一个方法,那该怎么办呢?
当然最简单粗暴的方式是把newMethod添加到currentClass中,然后直接实现该方法就OK了。
但考虑到OC是单继承的,子类可以拥有父类的方法和属性。而这个方法只有这个类需要,而它的子类不需要。那么就可以用类别
还有,如果你觉得系统提供的类太过局限,不能达到你的要求,你还想实现别的功能,但是你还不能修改系统提供的方法,这个时候,你就可以发挥OC动态语言的特性,添加一个类别
苹果为了解决这个问题,就引入了分类(Category)的概念。

Category的注意点:

  • Category的小括号内一定要有名字;故Class Extension亦被称之为匿名分类;
#import
@interface 类名(分类名字)
/* 方法声明*/
@end
@implement 类名(分类名字)
/*方法实现*/
@end
  • Category的方法不一定非要在@implement中实现,也可以在其他位置中实现,但是当调用Category的方法时,依据继承树没有找到该方法的实现,程序则会崩溃;并且,Category的方法优先级较高,可以覆盖原类的方法;
  • Category的方法中,不可以调用super方法;
  • 在实际开发中要注意的是,Category 方法可能会覆盖于同一个类class 的其它 category 中的方法。但也可能被覆盖,因为不法预知他们的加载优先顺序,出现这种情况通常会在编译时出错。如果在一个开发的SDK中使用了类别, 就最好保证类别名不同于使用者的类别名以及类别方法也不同于使用者的类别方法名, 通常通过加前缀来做到。
  • 分类中的可以写@property, 但不会生成setter/getter方法, 也不会生成实现以及私有的成员变量(编译时会报警告),但是可以使用@dynamic(即运行时Runtime)来弥补这种不足.

二、类扩展(Class Extension)

Extension是Category的一个特例。类扩展与分类相比只少了分类的名称,所以称之为“匿名分类”。其实开发当中,我们几乎天天在使用。对于有些人来说像是最熟悉的陌生人。

  • 作用:
    • 能为某个类添加成员变量,属性,方法;
    • 一般的类扩展写到.m文件中;
    • 一般的私有属性写到类扩展中
#import
@interface myClass()
{
     // 成员变量
}
// 属性
// 方法
@end
@implement
@end

Category和Extension的区别

  • Category的小括号中有名字,而Extension没有;
  • Category只能扩充方法,不能扩充成员变量和属性;
  • 如果Category声明了一个属性,那么Category只会生成这个属性的set,get方法的声明,也就不是会实现.
  • 类扩展不能像类别那样拥有独立的实现部分(@implementation部分),也就是说,类扩展所声明的方法必须依托对应类的实现部分来实现。
  • 定义在 .m 文件中的类扩展方法为私有的,定义在 .h 文件(头文件)中的类扩展方法为公有的。类扩展是在 .m 文件中声明私有方法的非常好的方式。

你可能感兴趣的:(iOS开发基础:类别(Category)与类扩展 (Extension))