在oc中要为类扩充功能有如下几种方式:
1.子类化:通过继承类并添加方法实现功能扩充(该方式可以扩充方法,也可以扩充实例变量)
2.直接在该类中修改源代码
3.Category
category叫分类,类目
是为没有源代码的类扩充功能,扩充的功能会成为原有类的一部分,可以通过原有类或者原有类的对象直接调用,并且可继承
该方式只能扩充方法,不能扩充实例变量
(1)在类目的.h文件中声明需要添加的方法
@interface NSString (AddMethod)
//????声明sayHi方法????
+ (void)sayHi;
@end
在类目的.m文件中实现对应的方法
@implementation NSString (AddMethod)
//实现sayHi方法
+ (void)sayHi
{
NSLog(@"Hello");
}
@end
4.Extension
extension叫延展
为能够获得源代码的类添加私有的实例变量和方法
使用方法:相当于把category的.h文件挪到原始类的.m文件中
例子:
使用延展为Teacher类添加一个私有的方法(领工资的方法),同时添加私有的实例变量(_salary)存储对应的薪资
代码如下:
Teacher类中.m文件中的代码 @interface Teacher() { NSInteger _salary; } - (NSInteger)getSalary; @end @implementation Teacher - (NSInteger)getSalary { NSLog(@"这个月发了不少,可以吃大餐了"); _salary = 10000; return _salary; } @end
5.协议(类服从协议,实现协议中的方法来扩充功能,但只能扩充方法,不能扩充实例变量,必须要拥有该类的源代码)
Delegate叫代理
delegate设计模式有三个要素:委托方,代理方,协议
协议是一套标准(方法的声明),只有.h文件
注意:协议的方法默认是必须实现的,即@required修饰的方法。关键字@optional修饰的方法是可选的,可实现也可不实现
实现步骤:
1.委托方制定一套协议(在委托方的.h文件中)
2.委托方声明一个delegate属性(assign修饰),存储代理方对象:@property(nonatomic,assign) id<协议名> delegater;
3.代理方需要遵守协议,对协议中的方法进行实现
4.将代理方设置为委托方的代理人
5.委托方在合适的时机通知代理方对象去执行相应的操作(代理方对象调用respondsToSelector方法判断能否响应选定的方法)