zoukankan      html  css  js  c++  java
  • Obbjective-C中的protocol与代理模式

    使用协议的流程:

     --> 定义协议

     --> 让类遵守这个协议

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

    一、定义协议

    什么是协议? 

    协议就是一些方法的声明,一般写到一个.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; 声明一个类。

  • 相关阅读:
    python 正则表达式
    Python 集合
    Python 类的使用
    Python 分支、循环语句
    Python 基础之字典(dict)的用法
    Python 之字符串常用操作
    python tuple元组操作
    Python list的常用操作
    appium 二次切换webview后无法找到页面元素
    Locust API 文档
  • 原文地址:https://www.cnblogs.com/yilizhijiaotianxiashao-yincaiersanshijianduo/p/4726101.html
Copyright © 2011-2022 走看看