Protocol: 带实现的方法列表,协议方法分@required和@optional
❤️ Category:为已有类添加方法的声明与实现。
(1)只能添加方法,不能添加成员变量,添加属性要用Runtime运行时来完成;
(2)方法必须实现,否则会警告️,调用后崩溃;
(3)分类方法内部可以访问已有类的成员变量和方法;
(4)添加的方法与已有类同名时会造成覆盖;
(5)私有方法供内部调用;
️:分类方法的调用:
(a)在外部调用(如main函数),需要导入分类的头文件;
(b)在本类中调用,要么分类在.h文件声明,.m中直接调用;
要么分类单独声明.h、.m两个文件,本类的.m中导入分类头文件;
(本类中不导入分类头文件,鬼知道本类在外部声明了多少分类文件)
(c)要想在子类中调用分类方法,需要分类在本体的.h文件中进行声明。
️:常见的分类多半声明在本类.h文件中,在外部供本类、子类实例调用,如UIApplication.h文件中声明的大量分类方法。
❤️ Extension (类扩展):匿名分类,专门用来为已有类添加私有的成员变量和方法的声明以及实现;
(1)能同时添加成员变量,属性和方法,均为私有;
(2)同上;
(3)同上;
(4)同上;
(5)同上;
❤️ 两者的区别(自己总结的)
(1)声明上:
协议:可以声明方法和属性,但不能声明成员变量;
分类:可以声明方法和属性,但不能声明成员变量;
(2)实现上:
协议:方法可以实现,也可以不实现;
分类:必须实现(否者编译可能会通过,但是运行会crash);
(3)存在意义上:
协议:方法由代理去实现,重在对象间的相互通信;
分类:方法由本类或子类实例去实现;
️注意:协议和分类是可以通过@property形式声明属性的,只不过在协议、分类中声明的属性,只有对应的setter/getter方法的声明,连实现都没有,更没有生成对应的成员变量。因为协议中只可以声明方法,分类中只能声明方法和对应的实现。
️Q:分类和协议中声明属性的意义是什么呢?
实际上,协议中声明的属性不能算是真正的属性。完整的属性声明包含了成员变量、setter和getter方法的声明/实现,而协议中的属性只是声明了setter和getter方法,并没有自动实现,也不会自动声明带下划线的成员变量。其实它和直接声明方法本质上并没有区别,只是形式上更加简洁,系统经常这么做是因为它靠的不是自动生成器,而是自己手动实现并匹配了成员变量(注意,系统在协议中声明的属性绝大多数都是readOnly的,比如description方法)