• OC学习——OC中的@protocol(@required、@optional)、代理设计模式


    一、什么是协议?
    1.协议声明了可以被任何类实现的方法
      2.协议不是类,它是定义了一个其他对象可以实现的接口
      3.如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议。
      4.协议经常用来实现委托对象。一个委托对象是一种用来协同或者代表其他对象的特殊对象。
      5:委托,就是调用自己定义方法,别的类来实现。
    另外:
    可以用来声明一大堆方法(不能声明成员变量)
    只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明
    只要父类遵守了某个协议,就相当于子类也遵守了
     
    二、格式
    协议
    @protocol 协议名称
    // 方法声明列表
    @end
    某个类遵守某个协议
    @interface 类名 : 父类 <协议名称>
    @end
    某个协议遵守某个或者某些协议,一个协议可以遵守其他多个协议,
    多个协议之间用逗号 , 隔开。
     @protocol 协议名称 <其他协议名称1, 其他协议名称2>
    @end
    定义变量时,限制这个变量保存的对象遵守某个协议
     类名<协议名称> *变量名;
     id<协议名称> 变量名;
     NSObject<MyProtocol> *obj;
     id<MyProtocol> obj2;
     
    @property中声明的属性也可用做一个遵守协议的限制
     
     @property (nonatomic, strong) 类名<协议名称> *属性名;
     @property (nonatomic, strong) id<协议名称> 属性名;
     @property (nonatomic, strong) Dog<MyProtocol> *dog;
     @property (nonatomic, strong) id<MyProtocol> dog2;
    三、协议里的关键字
     
    协议中有2个关键字可以控制方法是否要实现(默认是@required),在大多数情况下,
    用途在于程序员之间的交流
    @required:这个方法必须要实现(若不实现,编译器会发出警告)
    @required
    - (void)test;
    - (void)test2;
    @optional:这个方法不一定要实现
    @optional
    - (void)test3;
     
    四、基协议
     
    NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它
    其实还有一个协议,名字也叫NSObject,它是一个基协议,最根本最基本的协议
    NSObject协议中声明很多最基本的方法,比如description、retain、release等
    建议每个新的协议都要遵守NSObject协议
     
     
     五、注意点:
     
    协议可用定义在单独.h文件中,也可用定义在某个类中
     1> 如果这个协议只用在某个类中,应该把协议定义在该类中
     2> 如果这个协议用在很多类中,就应该定义在单独文件中
     分类可用定义在单独.h和.m文件中,也可用定义在原来类中
      一般情况下,都是定义在单独文件
      定义在原来类中的分类,只要求能看懂语法
     
    六、代码练习:
     
    1、定义协议
    @protocol Client <NSObject>
    -(void)defaultMethod;//默认必须实现
    @required//必须
    -(void)required;
    @optional//可选
    -(void)optional;
    @end 
    2、符合(实现)协议
    #import "Client.h"
    @interface JackClient : NSObject<Client>
    @end 
    @implementation JackClient
    -(void)defaultMethod{
        NSLog(@"this is defaultMethod");
    }
    -(void)required{
        NSLog(@"this is required method");
    }
    @end
     
     
     
    七、代理设计模式
    有些麻烦的事情不想自己亲自做,就可以找个人帮忙做,即交给代理对象去做
    设计原则
    首先得拥有某个代理对象属性

    @property (nonatomic, retain) id<TicketDelegate> delegate;

    其次要很清楚代理有哪些方法(协议文件.h)
    #import <Foundation/Foundation.h>
    @protocol TicketDelegate <NSObject>
    - (double) ticketPrice;
    - (int) leftTicketsNumber;
    @end
    最后要保证能解耦
     
     
    实现方案
    定义一个protocol,在其中声明一些和代理沟通的方法
    #import <Foundation/Foundation.h>
    @protocol TicketDelegate <NSObject>
    - (double) ticketPrice;
    - (int) leftTicketsNumber;
    @end
    拥有一个代理属性id<protocol> delegate

    @property (nonatomic, retain) id<TicketDelegate> delegate;

    让代理遵守protocol
    这个代理的.h文件中
    #import <Foundation/Foundation.h>
    #import "TicketDelegate.h"
    @interface Agent : NSObject <TicketDelegate>
    @end
    @implementation Agent
     
    这个代理的.m文件中
    #import "Agent.h"
    - (int)leftTicketsNumber
    { 
    // 
        return 1;
    }
    - (double)ticketPrice
    {
        // 
        return 1000;
    }
    @end
     
     
  • 相关阅读:
    《机器学习》周志华 习题答案8.5
    《机器学习》周志华 习题答案8.3
    《机器学习》周志华 习题答案7.3
    《机器学习》周志华 习题答案6.2
    《机器学习》周志华 习题答案4.3
    Python使用wxPython、py2exe编写桌面程序-乾颐堂
    python生成验证码,文字转换为图片-乾颐堂
    python使用wmi模块获取windows下的系统信息监控系统-乾颐堂
    Python图像处理库:Pillow 初级教程-乾颐堂
    python的metaclass浅析-乾颐堂
  • 原文地址:https://www.cnblogs.com/anakin/p/7814946.html
Copyright © 2020-2023  润新知