###开篇 在平时的项目中时常可以用到Category,在研究别人的代码时遇见Category和Extension也是一件极其平常的事情。还记得当我第一次见到这种写法的时候我的内心是崩溃的。
我们来看一下上面的两张appdelegate.m的内容,两个简单的小工程中,一个的内容中有上百行甚至几百行的代码,另一个却只有几行,我们先不说Category的别的功能单单是代码的分块,清晰条理和代码的可读性上就值得我们研究一番更何况他不止于此呢。 ###创建方法 既然那么好用我们怎么创建他呢,话不多说上图片。
- 有两方面局限性: (1)无法向类中添加新的实例变量,类别没有位置容纳实例变量。 (2)名称冲突,即当类别中的方法与原始类方法名称冲突时,类别具有更高的优先级。类别方法将完全取代初始方法从而无法再使用初始方法。
- 主要有3个作用: (1)可以将类的实现分散到多个不同文件或多个不同框架中,方便代码管理。也可以对框架提供类的扩展(没有源码,不能修改)。 (2)创建对私有方法的前向引用:如果其他类中的方法未实现,在你访问其他类的私有方法时编译器报错这时使用类别,在类别中声明这些方法(不必提供方法实现),编译器就不会再产生警告 (3)向对象添加非正式协议:创建一个NSObject的类别称为“创建一个非正式协议”,因为可以作为任何类的委托对象使用。
####Extension
- Extension常被称为是匿名的Category(比如:在字符串中类扩展extension,添加的属性str1和show方法都是私有的,只能在String类中可以访问得到 )
- 用于给类添加新方法,但只作用于原始类,不作用于subclass
- 只能对有implementation源代码的类写Extension,对于没有implementation源代码的类,比如framework class,是不可以的 Extension可以给原始类添加新方法,以及新属性
####他们的主要区别是: 1、形式上来看,extension是匿名的category。 2、extension里声明的方法需要在mainimplementation中实现,category不强制要求。 3、extension可以添加属性(变量),category不可以。 ###使用举例 个人感觉在项目中Category的使用还是比较多的现在举个简单的代码例子
在工程中创建两个Category的分类,一个是UIButton的一个是appdelegate的。在.h文件中按钮的类暴露的方法如图所示。我们在.m中实现它,如下图