协议和代理

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

协议和代理

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

【协议】

@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: @"我是小刚"];

    }

 

posted @ 2016-03-28 21:33  甘林梦  阅读(223)  评论(0编辑  收藏  举报