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浏览器

  • 相关阅读:
    Android 按键消息处理Android 按键消息处理
    objcopy
    SQLite多线程读写实践及常见问题总结
    android动画坐标定义
    Android动画效果translate、scale、alpha、rotate
    Android公共库(缓存 下拉ListView 下载管理Pro 静默安装 root运行 Java公共类)
    Flatten Binary Tree to Linked List
    Distinct Subsequences
    Populating Next Right Pointers in Each Node II
    Populating Next Right Pointers in Each Node
  • 原文地址:https://www.cnblogs.com/bossren/p/6429175.html
Copyright © 2011-2022 走看看