OC提供了一种与众不同的方式-category,可以动态的为已经存在 的类添加新的行为(方法)
这样可以保证类的原始设计规模较小,功能增加时,再逐一扩展
category使用简单的方式,实现了类的相关方法的模块化,把不同的类方法分配到不同的分类文件中。
新建一个文件,选择category,然后category on 你要扩展的类:文件生成后,会这样
注意:分类只能增加类的方法,不能增加成员变量。
Category使用场景:
1.在定义类时的某些情况下,(例如需求变更),你可能想要为其中的某个或几个类中添加新的方法:
2.一个类中包含了许多不同种类的方法需要实现,而这些方法需要不同团队的成员实现
3.在使用基础类库中的类时,有可能希望这些类实现一些自己需要的方法,比如写个NSString +JSON.h为NSString这个类扩展一些解析,JSON的方法。
Protocol:(协议)
<>:表示实现某个协议。
协议的实现步骤:
1.制定一个协议,
@protocol ButtonDelegate <NSObject>
-(void)Onclick:(Button*)btn;
@end
2.设置监听器:delegate :监听器:
@interface Button : NSObject
@property (nonatomic,retain) id <ButtonDelegate> delegate;
-(void)click;
@end
模拟按钮被点击,如果点击了,就通知监听器。
-(void)click{
//respondsToSelector这个方法可以判断一个代理有没有实现协议中的方法。
//该函数返回类型类型是一个bool类型的。
if([_delegate respondsToSelector:@selector(Onclick:)]){
//如果按钮被点击了就通知监听器;
[_delegate Onclick:self];
}else{
NSLog(@"监听器没有实心Onclick 方法 :");
}
}
Delegate实现了ButtonDelegate这个协议,然后协议里面有一个onClick方法:
@autoreleasepool {
Button *button = [[[Button alloc]init]autorelease];
ButtonListener *listener = [[[ButtonListener alloc]init]autorelease];
MyListener *listener2 = [[[MyListener alloc]init]autorelease];
button.delegate=listener2;
[button click];
button.delegate=listener;
[button click];
}
如果button被点击了,就会通知监听器,按钮被点击了。这时候listener充当button的监听器。
因为协议里面有一个方法,只要你满足这个协议,就要实现它的方法,然后再实现了协议的文件里面要实现在协议里面定义的那个方法。
//协议的声明,和@class一致。这也是为了系统的
@protocol ButtonDelegate;
然后在.m文件里面包含协议所在的那个头文件
注意:一般情况下,如果你要实现一个协议的话,你就要把点击了按钮的那个对象给打印出来,然后也要判断监听器是否有协议所规定的方法:
抛出一个对象
-(void)Onclick:(Button*)btn;
判断是否有回应函数。
//respondsToSelector这个方法可以判断一个代理有没有实现协议中的方法。
//该函数返回类型类型是一个bool类型的。
if([_delegate respondsToSelector:@selector(Onclick:)]){
//如果按钮被点击了就通知监听器;
[_delegate Onclick:self];
}else{
NSLog(@"监听器没有实心Onclick 方法 :");
}
NSObject :基类:成员方法:
1.iskindOfClass 和isMemberOfClass 的区别。
反射:
根据一个字符串,实例化一个对象。
1.。类的反射:
2.方法的反射: