zoukankan      html  css  js  c++  java
  • 协议和代理

    ==========================

    协议和代理

    ==========================

    【协议】

    @protocol

    【协议的作用】:规定了需要实现的接口方法,在委托方和代理方都需要遵从的一个协议。

    委托方通过(nt.delegate = self;)这种方式进行委托【注,不仅可以委托自己,也可以委托其他的类】

    代理方通过([_delegate test];)这种方式进行方法的代理(替...干了....)

    【例如】:

    小明是委托方,小刚是代理方。他们之间都遵从一个协议。协议中规定了2个方法(功能);小明把自己委托给了小刚,小刚则拥有了指向小明的对象的指针,通过这个指针可以访问小明的任何方法(必须是协议中规定的方法)

    【注】协议中的方法有如下2中权限

    1.@required//委托方(小明)必须实现这个方法

    2.@optional//委托方(小明)可以实现,也可以不实现这个方法

    【注】@required要求的方法如果不实现,则会提示警告,@optional如果不实现,则没有任何问题。

    【注】使用哪个协议,必须包含协议的头文件。

    【代理和协议的添加方式】

    1.包含头文件

    2.在委托方添加协议,然后实现协议方法

    3.在代理方实现代理对象变量。

    4.在委托方,给代理对象变量赋值

    5.在需要用到的地方,通过代理对象的变量,去访问委托的方法

    #import <Foundation/Foundation.h>

    #import "xiaoming.h"

    int main(int argc, const char * argv[]) {

        @autoreleasepool {

            xiaoming* xm = [[xiaoming alloc]init];      

            // 测试用的

            [xm method];

        }

        return 0;

    }

    #import <Foundation/Foundation.h>

    #import "print.h"

    #import "xiaoming.h"

    #import "xiaogang.h"

    @implementation xiaoming

    // 在method这个方法里面练习委托和代理的用法

    - (void)method

    {

        xiaogang* xg = [[xiaogang alloc]init];

        // 把自己委托给了小刚,这是一个赋值的过程

        xg.woshidaili = self; 

        // 测试代理是否好用

        [xg test];

    }

    - (void)OutPutPersonInfo

    {

        NSLog(@"我是委托方,我委托小刚去干一件事情");

    }

    @end

    #import <Foundation/Foundation.h>

    #import "print.h"

    @interface xiaoming : NSObject<print>

    - (void)method;

    @end

    #import <Foundation/Foundation.h>

    #import "print.h"

    @interface xiaogang : NSObject

    // woshidaili 是一个自定义类型 ,类型是:id<print>

    // 可以理解为:是id类型,只是这个id类型遵从了协议

    // 【注】id后的尖括号肯定是跟着协议的名称

    @property id<print> woshidaili;

    // 用来测试代理是否好用

    - (void)test;

    @end

    #import "xiaogang.h"

    @implementation xiaogang

    - (void)test

    {

        // 通过代理对象的变量 去访问委托方的方法

        [_woshidaili OutPutPersonInfo];

    }

    @end

    #import <Foundation/Foundation.h>

    @protocol print <NSObject> 

    // 打印个人信息

    - (void)OutPutPersonInfo;

    @end

    【协议和代理用处】

    例如商品页的商品购买,但是用户没登陆,需要先登陆,登陆成功后,需要把状态告诉商品页,商品页判断登陆状态,然后继续进行下一步操作。【注】登陆页就是在商品页中创建出来的一个对象;【代理的回调】

    【协议和代理局限性】

    只能是2个相关联的类之间进行数据的互相访问。

    【例如】小明委托小刚干什么;小刚委托小红干什么

    【respondsToSelector方法】

    作用:使代码更安全,防止崩溃

        // 判断OutPutPersonInfo 方法是否存在,存在跳入方法

        if([_woshidaili respondsToSelector: @selector(OutPutPersonInfo:)])

        {

            [_woshidaili OutPutPersonInfo: @"我是小刚"];

        }

  • 相关阅读:
    JS 关于 URL 的编码或解码方法
    PHP 获取上一个页面的url
    踩坑 Uncaught RangeError: Maximum call stack size exceeded
    Wordpress 数据库查询错误 Call to a member function get_results() on null
    Chrome autocomplete="off"无效
    js 遍历对象属性(for in、Object.keys、Object.getOwnProperty) 以及高效地输出 js 数组
    PHP PDO fetch() 详解
    Wordpress 自定义文章类型添加 Categoried、Tags
    Mac: mac git 的安装 及实现自动补全
    Uncaught TypeError: Cannot read property of undefined In JavaScript
  • 原文地址:https://www.cnblogs.com/ljcgood66/p/5330707.html
Copyright © 2011-2022 走看看