category extension protocol(类目,延展,协议)

作用

类目就是为已存在的类添加新的方法。但是不能添加实例变量。比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现。

@interface NSMutableArray (Sort) //为NSMutableArray类添加Sort方法,Sort就是类目名,做到见名知意 例: 为UIColor 添加一个 Addtions @interface UIColor (Addtions) +(UIColor *)randomColor; @end #import "UIColor+Addtions.h" @implementation UIColor (Addtions) +(UIColor *)randomColor{     CGFloat red=arc4random()%256/255.0;     CGFloat green=arc4random()%256/255.0;     CGFloat blue=arc4random()%256/255.0;     UIColor *color=[UIColor colorWithRed:red green:green blue:blue alpha:1];     return color; } @end
Category的使用场景有那些呢:
1、类包含了很多个方法实现,而这些方法需要不同团队的成员来实现
2、当你在使用基础类库中的类时,你不想继承这些类而只想添加一些方法时。
 
Category能实现上面的需求,当然也有使用Category是需要注意的问题:
1、Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类来实现。
2、Category可以重载原始类的方法,不大不推荐这么做,这样会覆盖掉原始类的方法。如果确实要重载,那就通过继承创建子类来实现。
3、和普通接口有所区别的是,在Category的实现文件中的实例方法只要你不去调用它你可以不用实现所有声明的所有方法。



延展

2.延展

延展的作用就是定义自己的私有方法。

形式和类目相同,不用新创建文件,只是把类目的interface地方的文件放在了你需要扩展的类的.m文件里边。


@interface Student (extension)//为Student类创建一个私有的方法text
-(void)text;
@end

@implementation Student
-(void)hello;
{
    [self  text];
}

-(void)text
{
    NSLog(@"你好");
}
@end

外界  [student hello]的时候就会打印出“你好”。但是在外界不能调用text方法,[student text]是不对的。只能在.m文件里边通过self来调用私有方法text。隐藏了内部的实现。

3.协议

(1).协议声明了可以被其他的类实现的方法。协议本身必不会去实现。

(2).协议不是类,只是一个其他对象可以实现的接口。

定义一个协议:

#import <Foundation/Foundation.h>
@protocol MarryProtocol <NSObject>//定义一个结婚协议,结婚协议也可以继承其它的协议。
@required   //必须遵守的协议,在遵守MarryProtocol协议的类的.m文件中去实现里边的方法。
- (void)washClothes;
- (void)cook;
@optional  //可选的协议
- (void)makeMoney;
@end

代理(委托)模式:自己有需求,但是让别人去做。


 例:
创建一个MarryProtocol协议
@protocol MarryProtocol <NSObject>

@required
-(void )makeMoney;
-(void)washCloth;
-(void)cook;

@optional
-(void)doHouseWork;
@end





创建一个boy类

#import "MarryProtocol.h"
#import "Girl.h"
@interface Boy : NSObject
@property (nonatomic,assign)id<MarryProtocol> wife;
-(void)rice;
-(void)washClothes;
-(void)giveMoney;
@end
//
实现
#import "Boy.h"
@implementation Boy
-(void)rice
{
    [_wife cook];
}
-(void)washClothes
{
    [_wife washCloth];
}
-(void)giveMoney
{
    [_wife makeMoney];
}
@end


创建一个girl类
#import "MarryProtocol.h"
@interface Girl : NSObject <MarryProtocol>//尊守协议

@end

实现
#import "Girl.h"
@implementation Girl
-(void )makeMoney
{
    NSLog(@"挣钱");
}
-(void)washCloth
{
    NSLog(@"洗衣服");
}

-(void)cook
{
    NSLog(@"做饭");
}
@end

主程序调用

Boy *boy=[[Boy alloc]init];
    Girl * girl=[[Girl alloc]init];
    boy.wife=girl;
    [boy rice];
    [boy washClothes];
    [boy giveMoney];

协议也可以写在一个类里边,用到的时候引入类的头文件就可以。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章