——- android培训、java培训、期待与您交流! ———-
分类(Category)
分类 : 在不改变原来模型(类内容)的前提下,扩充类的方法
扩充类的方法有两种:继承、分类(Category)
习惯将声明文件和实现文件名称统一采用”原类名+Category名称.m/.h”的方式命名
如 : NSString 的分类可以命名为 NSString+Tools.h
分类格式
// 分类的声明
@interface 类名(分类名称)
// 方法声明
@end
// 分类的实现
@interface 类名(分类名称)
// 方法实现
@end
注意:
Category 可以访问原始类的成员变量,但不能添加成员变量,只能添加方法。
Category 可以实现原始类的方法,但是会替换原来的方法,要重载最后是创建子类。优先调用分类同名中的方法
方法调用的优先级: 分类(最后编译的父类优先) –> 本身类 –> 父类
多个 Category 中如果实现了相同的方法,只有最后一个参与编译的才有效(最终覆盖)
分类中定义的类方法,调用时使用被分类的类名
即为原类 Person 分类 Person+Xxx 中定义的类方法yyyZzz
调用该类方法用 [Person yyyZzz] 即可
protocol (协议)
协议 : 在 .h 文件中有声明方法,类遵守协议后可以调用里面的方法,自己重写这些方法
声明类:
@class 类名;
声明协议(protocol):
@protocol 协议名;
确实要调用,需要在.m文件中#import 需要调用类(协议)的头文件(.h)
协议中方法声明的关键字
@required : 必需的,必须实现的方法,否则会后警告(默认)
@optional : 可选的,不要求实现,不会有警告
类继承类 : 父类只能有一个
类名 : 父类名
@interface 类名 : 父类名
类、协议实现协议时 : 实现协议可以同时有多个
类名(或者协议名) <需实现协议名>
类遵守协议
@interface 类名 : 父类名 <协议1,协议2,...>
/**/
@end
协议遵守协议
@protocol 协议名 <其他协议1,其他协议2,...>
/**/
@end
可以用 conformsToProtocol 判断某个类是否实现了某个协议:
[obj conformsToProtocol : @protocol(MyDelegate)];
定义指针变量时就限制该变量要保存的变量
类名<协议名称> *变量名; // 该变量可以存储的变量必须遵循<协议>
@property 中声明的成员变量限制要保持的变量
@property (nonatomic , strong) 类名<协议名称> *成员变量名;
——- android培训、java培训、期待与您交流! ———-