zoukankan      html  css  js  c++  java
  • 【Objective-C 篇】 ☞ 9. 协议

    协议(Protocol)

    1.1 概念

    protocol 可以声明一些必须实现的方法和选择实现的方法。

    协议就是规则(规范),定义一个协议就相当于制定规则。

    • 协议可能是一个独立的头文件,也可能写在别的类的头文件里。
    • 协议是OC语言中制定规则(规范)的一种语法。(制定协议方便类与类之间进行通信,可以传参数、传数据)
    • 创建协议(TRProtocol.h文件)

        

    protocol注意点:

    • protocol就一个用途,用来声明一大堆的方法(不能声明成员变量),不能写方法的实现。
    • 只要父类遵守了某个协议,那么子类也相当于遵守了某个协议
    • OC不支持多继承,但是能够遵守多个协议。

    1.2 语法

    1.2.1 定义协议(相当于制定规则,格式与定义类一样)

    @protocol 协议名 <父协议>

    //1.默认是必须实现的方法(默认是:@required

    //方法的声明

    //2.从此开始的方法可选的

    @optional

    //可选的方法声明

    //3.必须要实现的方法

    @required

    //必须实现的方法声明

    @end

         

    1.2.2 遵守协议(相当于遵守规则)

    让类遵守协议

    • 一个类可以遵守1个或多个协议
    • 任何类只要遵守了协议,就相当于拥有了协议的所有方法声明

    @interface 类名 : 父类名 <协议名称1, 协议名称2, ...>

    @end

    @implementation 类名

    //实现协议中规定的方法(合成setter和getter方法)

    @synthesize 属性=实例变量

    //实现协议中规定的方法

    //..

    @end

         

        protocol和继承的区别:

    • 类继承之后默认就拥有父类方法的声明和实现,而类遵守协议只拥有方法的声明没有实现
    • 相同类型的类(is a 关系)可以使用继承,但是不同类型的类只能使用protocol
    • protocol可以用于存储方法的声明,可以将多个类中共同的方法抽取出来,以后让这些类遵守协议即可

    1.2.3 协议的相关语法规定

    1)协议中规定的属性和方法都是公开的。

    一个类一旦遵守了这个协议,就相当于给外界公开了这些访问接口。

    2)协议可以继承协议(即协议可以遵守协议),协议的继承相当于将两个协议合并。

        

    3)协议支持多继承,一个协议可以同时继承多个协议。(合并多个,协议中只有属性和方法的声明)

        

         4)一个类同时也可以遵守多个协议。

        

    1.3 协议的应用场景

    一、类型限定:

        (1)可以将协议写在数据类型的右边, 明确的标注如果想给该变量赋值, 那么该对象必须遵守某个协议

         

        (2)协议经常与id类型结合使用

    id p; //id定义的引用变量,可以指向任何类型的对象

    id <协议名> p; //用协议可以给id类型的变量做一个限制

    此时,p就只能指向遵守了指定协议的对象。(不能指向任何对象,受到了限制,这样更安全了)

    • 以前,我们可以用 id 来定义属性,定义方法的参数,定义方法的返回值类型。
    • 现在,我们可以用id<协议>的形式来定义属性,定义方法的参数,定义方法的返回值类型等。
    • 这种协议的使用会出现在方法的参数,或方法的返回值上,或类的属性定义中。通过这种引用访问属性或调用方法时,编译器会做类型检查,可以避免很多调用错误。

    二、代理设计模式

    设计模式,可以简单理解为 能够高效完成某一件事的一种规律。

    代理可以帮助一个对象完成某一些操作

    代理设计模式的应用场景:

    1. 当对象A发生了一些行为,想通知对象B(让对象B成为对象A的代理对象)
    2. 对象B想监听对象A的一些行为(让对象B成为对象A的代理对象)
    3. 当对象A无法处理某些行为的时候,想让对象B帮忙处理(让对象B成为对象A的代理对象)

    代理设计模式的作用:

    1.A对象监听B对象的一些行为,A成为B的代理

    2.B对象想告诉A对象一些事情,A成为B的代理

    3.对象B请对象A完成某些行为,A成为B的代理

    代理设计模式的总结:

    如果你想监听别人的一些行为,那么你就要成为别人的代理

    如果你想告诉别人一些事情,那么就让别人成为你的代理

    代理设计模式的开发步骤

    • 1.拟一份协议(协议名字的格式:控件名 + Delegate),在协议里面声明一些代理方法(一般代理方法都是@optional)
    • 2.声明一个代理属性:@property (nonatomic, weak) id<代理协议> delegate;
    • 3.在内部发生某些行为时,调用代理对应的代理方法,通知代理内部发生什么事
    • 4.设置代理:xxx.delegate = yyy;
    • 5.yyy对象遵守协议,实现代理方法

    代理和通知的区别:

      代理:1个对象只能告诉另一个对象发生了什么事

      通知:1个对象可以告诉N个对象发生了什么事

    • KVC(Key Value Coding)常见作用:给模型属性赋值
    • KVO(Key Value Observing)常用作用:监听模型属性值的改变

      

    只能一对一创建使用

    一.代理协议解决对象间通信的关键:判断谁是代理对象,谁是被代理对象。

    判断方法:

    (1)谁产生事件,谁就是被代理对象;

    (2)谁响应事件,谁就是代理对象。

    例如:小孩饿了,需要母亲喂饭。饿了要吃饭这一事件是小孩产生的,母亲收到通知后去喂饭,是响应者,所以小孩是被代理对象,母亲是代理对象。

     

    协议+代理 = 委托模式

    1.4  协议的实际应用

    1.4.1 制定规则(规范)

      USB标准规范

      将服务的提供者和服务的使用者分开。可以分工明确。

    1.4.2 委托和代理

      委托: 一个对象(A)委托另一个对象(B)完成一些任务。

      代理: 被委托,一个对象(B)代表另一个对象(A)完成一些任务。

      委托方和代理方: 对象A委托对象B完成一些任务,对象A就是委托方,对象B就是被委托方(也叫代理方)

      你要租房, 找中介:

      你委托中介给你找房子。你是委托方,中介是被委托方(代理)

    1.4.3 具体实现

      委托方:UIAlertView

        1. 定义一个委托协议让被委托方(代理方)去遵守

        2. 定义一个委托属性对象,用于以后指向被委托对象

        3. 在需要调用方法的地方调用被委托对象(代理对象)的方法

      被委托方(代理方):TRWechat

        1. 遵守委托协议 

        2. 实现协议中规定的方法

        3. 将自己设置成委托方的被委托(代理)对象

    打开API文档:

    右键==>显示包内容==>Contents==>Resources==>Documents==>navigation==>index.html文件右键==>Safari浏览器

  • 相关阅读:
    能飞英语学习软件学习实践
    英语学习方式总结与实践
    Hello World
    centos 7.6中搭建samba共享服务
    PHP漏洞全解(一)PHP网站的安全性问题
    MySQL查询语句练习题
    在PHP中使用CURL实现GET和POST请求的方法
    js数组的操作大全
    php四种基础算法:冒泡,选择,插入和快速排序法
    Linux查看端口使用状态及启动
  • 原文地址:https://www.cnblogs.com/bossren/p/6429175.html
Copyright © 2011-2022 走看看