GeniusWarrior
雨停了,天晴了,感觉自己又行了

 

使用协议的流程:

 --> 定义协议

 --> 让类遵守这个协议

 --> 实现协议中对应的方法(必须要实现的)

 

 

一、定义协议

什么是协议? 

协议就是一些方法的声明,一般写到一个.h的头文件中.

 

协议的定义:(默认情况下遵守 NSObject协议)

    @protocol 协议名称 <NSObject>

    @end

 

二,遵守协议

(让某个类遵守协议,一个类可以遵守多个协议,在<>中用逗号隔开)

    1) 遵守一个协议:(先导入协议的头文件)

    @interface 类名 :NSObject <要遵守的协议名称>

 

    @end

 

    2) 遵守多个协议

    @interface 类名 :NSObject <要遵守的协议名称,要遵守的协议名称,要遵守的协议名称>

 

    @end

 

三,实现协议中的方法

(在类的.m文件中实现协议中的方法)

    1),定义一个协议:

   

 @protocol baseProtocol <NSObject>

    //声明一些方法

    -(void)eat;

    -(void)run;

    @end

 

 

    2),让类遵守这个协议

    // 1) 导入 头文件

   

#import "baseProtocol.h"

    @interface Person : NSObject<baseProtocol>

    @end

 

   3),在类的.m文件中实现协议的方法

   

  @implementation Person

    -(void)eat{

        NSLog(@"特别羡慕那些吃很多东西又不胖的人");

    }

    -(void)run{

        NSLog(@"人会跑");
} @end

 

    结论: 当一个类遵守了某个协议后,就相当于这个类有了协议中所有的方法的声明

 

1,一个协议也可以遵守其他的协议;

 

    @protocol workProtocol <NSObject>

    @end

 

    #import "workProtocol.h"

    @protocol baseProtocol <NSObject,workProtocol>

    @end

 

protocol的其他用法:

    1),不能声明成员变量;

    2),只要父类遵守了某个协议,那么子类也遵守;

    3),OC中的类可以遵守多个协议;

    4),基协议是NSObject;

    5),协议可以遵守多个协议;

 

 

2,@required 和 @optional 都是协议中的关键字

    @required 修饰的方法是必须要实现的,如果不实现,编译器会发出警告,默认

    @optional 修饰的方法是可以实现,也可以不实现的

 

@protocol baseProtocol <NSObject>
//@required 和 @optional 都是协议中的关键字
//@required 修饰的方法是必须要实现的
@required    //默认情况下都是必须要实现的
-(void)run;
-(void)eat;

//@optional 修饰的方法是可以实现,也可以不实现的
@optional
-(void)dajia;

@end

 

 

 

3,protocol类型限制

    第一种类型限制:

    给id类型增加限制

        id<houseHold> obj;

    增加<houseHold>以后,表示,obj只能赋值遵守了houseHold协议的对象

 

    第二种类型限制:

    表示,obj2赋值的时候,必须是Girl对象,并其遵守了houseHold协议.

        Girl<houseHold> *obj2;

 

    格式:

        对象<协议名称> 对象指针;   (通过协议,对这个对象做一些限制)

 

 

houseHoldprotpcol.h

@protocol houseHold <NSObject>
@required
-(void)ZuoFan;
-(void)XiYiFu;

@optional
-(void)goodJob;
@end

main.m


         Girl *mm = [Girl new];
        
        //增加类型限制
        // 第一种类型限制:给id类型增加限制
        // id<houseHold> obj;
        //增加<houseHold>以后,表示,obj只能赋值遵守了houseHold协议的对象
        //id<houseHold> obj = d;
        
        // 第二种类型限制:
        //表示,obj2赋值的时候,必须是Girl对象,并其遵守 了 houseHold协议.
        Girl<houseHold> *obj2 = mm;
        
        // 第三种类型限制
        obj2.dog = d;
        

 

 

4,id和instancetype的区别

    1).都能作为函数的参数返回值

    2).id能作为方法或者函数的返回值、参数类型,也能用来定义变量

    3).instancetype 能精确限制返回值类型

  

5,代理模式,  (传入的对象,代替当前类完成了某个功能,称为代理模式)

思路:

    1)定义一个协议,里面声明代理类需要实现的方法列表, 比如这里一个代理类需要实现

    findHouse方法

       

  @protocol findHouseProtocol <NSObject>

        -(void)findHouse;

        @end

 

 

    2)创建一个代理类(比如LinkHome),遵守上面的代理协议

   @interface LinkHome : NSObject<findHouseProtocol>

        @end

 

 

     3)在需要代理的类中(Student),定义一个对象类型为id且遵守代理协议的成员变量

    

@property(nonatomic, strong)id <findHouseProtocol>delegate;

 

 

    4)在Student类中调用成员变量_delegate(代理)的方法,调用代理类的方法

    

[self.delegate findHouse];

 

 

    5)main.m或其他使用Student类的文件中,为Student类的成员变量(代理类)赋值

      

   LinkHome *linkHome = [LinkHome new];

         stu.delegate = linkHome;

 

 

6,@protocol关键字,告诉编译器,这是一个协议.

在.m文件中使用的时候,需要导入这个协议.

    @protocol delegate; 声明一个协议.

    @class Person; 声明一个类。

 

posted on 2015-08-13 08:46  GeniusWarrior  阅读(478)  评论(0编辑  收藏  举报