category和protocol 第五天稍晚了一些。
2015-08-18 19:06
507 查看
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.方法的反射:
相关文章推荐
- Algorithms—80.Remove Duplicates from Sorted Array II
- AGFA 3rd MUSICA algorithm
- HDU 1036 Average is not Fast Enough!(水题)
- go language
- HDU 1029 Ignatius and the Princess IV
- django session使用方法
- hdoj 3635 Dragon Balls
- Google Doc搬运工:常用LDAP查询
- xcode 在哪里新建category、protocol等文件
- 集成Vuforia 5.0.5与Google Cardboard实现AR+VR的效果
- mogoose使用
- 【暑假】[深入动态规划]UVa 10618 Tango Tango Insurrection
- EGOTableViewPullRefresh实现下拉刷新
- django forms
- 借助江苏电信欢go进行流量推广活动合作的工作规范(一)
- 第三方库EGO刷新的使用
- mangodb简单命令
- OC 中的分类(Category)详解
- POJ 2195 Going Home
- 灰度世界算法(Gray World Algorithm)