分类
1.非正式协议与正式协议区别
2.对原有的类添加一些功能(方法)作为源类扩展,他的功能是扩展类的能力.为一个类创建分类,其实就是把它的实现分成几部分来实现。每个类别都是类的一部分。你可以为一个类写很多分类,这些分类都是原有类的一部分,其中的成员也会被原有类的子类继承。一个类可以有多个分类,但是每一个分类中,只可以为原有类增添方法,不能增添实例变量。
3.尽管分类可以访问原始类的实例变量,但是他不能添加自身的任何变量,如果需要添加变量,可以考虑创建子类。
4. 声明分类的一般格式:
@interface 所扩展的类名 (分类名) <protocol,...>
-(void)print;
@end
@interface className (categoryName) <protocol,...>
methodDeclaration//给原有类增加的新方法
methodDeclaration//或:覆盖原有类已有的方法(不推荐)
//-(void)print; 如果确实需要覆盖原有类的方法,推荐用继承。
...
@end
5.每一个类别都需要保证是唯一的,分类的名字用 原有类名/分类名字 来唯一标示
6.对于分类来讲,它里面的方法,如果不需要的话,可以不实现。但是一定要注意,分类中只能为已有类添加方法,或者重写已有类的方法(不推荐),(重载一个方法后,再也不能访问原来的方法,因此,必须小心将被重载方法中的所有功能复制到替换方法中)但是不能添加实例变量
另外,写分类时,方法名不要同名
7.OC子类里可以调用被覆盖的父类版本的方法,用[super 方法名]
但被分类覆盖的方法没法再调用到
8.分类的好处:
对于分工明确的的开发,分组操作时可以使用分类,便于之后项目的整合。
使用分类时,可以把程序分来来调试,使它们能够更好的为原有类服务。
如果把分类的声明和实现都放在某一个类的.m文件中,那么这个分类的方法,只在本文件可见,其它文件不可见。是相对私有的,但是如果别人能知道方法原型,同样是可以去使用的。
一个类可以在不同的程序中进行不同的扩展,即使是系统的类也同样可以为它们写分类。
最后这一点很重要,因为每一个开发人员都有自己的命名规范或编程习惯,使用分类扩展方法时,方法名可以根据自己的需要命名。
其实对类进行扩展也可以使用继承,但是使用继承,可能会导致一个类出现一个庞大的子类体系。此外,使用子类的方法时对应的类也不是原有类,而是子类
9.分类的用处
对于一个不想公开源代码的类来讲,为它创建分类还是很有必要的
使用在扩展那些你无法看到类的实现代码的类的,你可以为这些类添加扩展函数,可以重载源类中的成员函数,来满足自己的实际需求
对于那些需要分工合作的工作,也是适合写分类
注意:
在使用分类的时候,只有一个限制:类别和继承关系不可以同时出现,需要分两步来做