您的位置:首页 > 编程语言 > Go语言

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.方法的反射:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: