iOS--总是记不住的分类和扩展
分类(category)
作用:可以在不修改原来的类的基础上,为其扩展方法,常用于为系统自带的类扩展方法。
举例:
想要收集每个页面的启动时间。
问题一:
项目中有很多页面了,一个一个的添加方法,即浪费了时间,当新增页面的时候又要添加方法,麻烦。
解决方法:
页面都继承于UIViewController,既然想要在每个页面都执行的代码,就可以写在父类中。
问题二:
UIViewController是官方类,只能调用,而不能修改实现。
解决方法:
使用分类(category)。
分类中能写什么?
分类中只能添加“方法”,而不能增加成员变量,(在runtime层面可以通过关联对象为分类添加成员属性)如果一定要在分类中添加成员变量,可以通过getter,setter进行添加。
分类中可以访问原来类中的成员变量,但是只能访问@protect和@public形式的变量,如果想要访问本类中的私有变量,只能通过方法去访问。
在本类和分类有相同的方法时,优先调用分类的方法再调用本类的方法。
分类(category)和类扩展(extension)的关系
1.类扩展(extension)是category的一个特例,有时候也被称为匿名分类,作用是为一个类添加私有的成员变量和方法。
2.类扩展能写点啥?和分类不同,类扩展即可以声明成员变量又可以声明方法。
3.类扩展听上去很复杂,但其实我们很早就认识他了。你记得继承自UIViewController的ViewController和继承自NSObject的类有什么不同么?
@interface ViewController()//这就是类扩展的写法
@end
4.类扩展可以定义在.m文件中,这种扩展方式中定义的变量都是私有的,也可以定义在.h文件中,这样定义的代码就是共有的,类扩展在.m文件中声明私有方法是非常好的方式。
7.类扩展中添加的新方法,一定要实现。category中则没有这种限制。
category
专门用来给类添加新的方法,除非通过runtime,否则不能给类添加成员属性,因为如果可以添加成员变量,添加的成员变量没有办法初始化。
extension
可以给类添加成员属性,但是是私有变量;可以添加方法,但也是私有方法。