协议,委托与代理

原创 2016年05月30日 15:52:08

一.协议

1.定义:

OC或者iOS中的协议:一组方法声明的列表,协议中不需要实现这些方法,谁遵守这个协议,谁就需要实现协议中的方法

2.协议创建的步骤

  • 制定协议的内容(方法声明列表)
  • 遵守协议(.h)
  • 实现协议中的方法(.m)
  • 调用协议中的方法

3.声明协议的关键字

(1)@required

表示必须实现的方法(默认)

(2)@optional

表示可以实现也可以不实现的方法

4.双向协议

程序举例
(1)ProtocolManToWoman.h文件

#import <Foundation/Foundation.h>

@protocol ProtocolManToWoman <NSObject>//基协议

- (void)white;
- (void)rich;
- (void)beautiful;

@optional
- (void)writeCode;

@end

(2)ProtocolWomanToMan.h文件

#import <Foundation/Foundation.h>

@protocol ProtocolWomanToMan <NSObject>

@required
- (void)height;
- (void)rich;
- (void)handsome;

@optional
- (void)writeCode;

@end

(3)Man.h文件

#import <Foundation/Foundation.h>
#import "ProtocolToMan.h"
@interface Man : NSObject <ProtocolToMan>

- (void)height;
- (void)rich;
- (void)handsome;
//- (void)writeCode;
@end

(4)Man.m文件

#import "Man.h"

@implementation Man

- (void)height{
    NSLog(@"I am so high....");
}

- (void)rich{
    NSLog(@"I am so rich....");
}

- (void)handsome{
    NSLog(@"I am very handsome...");
}

//- (void)writeCode{
//    NSLog(@"write hello world!....");
//}

@end

(5)Woman.h文件

#import <Foundation/Foundation.h>
#import "ProtocolToWoman.h"
@interface Woman : NSObject <ProtocolToWoman>

- (void)white;
- (void)rich;
- (void)beautiful;

//- (void)writeCode;

@end

(6)Woman.m文件

#import "Woman.h"

@implementation Woman

- (void)white{
    NSLog(@"white.....");
}

- (void)rich{
    NSLog(@"rich.....");
}

- (void)beautiful{
    NSLog(@"beautiful......");
}

//- (void)writeCode{
//    NSLog(@"writting code....");
//}
@end

(7)main文件

#import <Foundation/Foundation.h>
#import "Man.h"
#import "Woman.h"
int main(int argc, const char * argv[])
{

    @autoreleasepool {

        Man *man = [[Man alloc]init];
        if ([man respondsToSelector:@selector(height)]) {
            [man height];
        }
        if ([man respondsToSelector:@selector(rich)]) {
            [man rich];
        }
        if ([man respondsToSelector:@selector(handsome)]) {
            [man handsome];
        }
        if ([man respondsToSelector:@selector(writeCode)]) {
            [man writeCode];
        }
        else{
            NSLog(@"can not write code");
        }

        Woman *woman = [[Woman alloc]init];
        if ([woman respondsToSelector:@selector(white)]) {
            [woman white];
        }
        if ([woman respondsToSelector:@selector(rich)]) {
            [woman rich];
        }
        if ([woman respondsToSelector:@selector(beautiful)]) {
            [woman beautiful];
        }
        if ([woman respondsToSelector:@selector(writeCode)]) {
            [woman writeCode];
        }

    }
    return 0;
}

二.委托与代理

委托代理与正向传值程序举例
(1)ProtocolBossToWorker.h文件

#import <Foundation/Foundation.h>

@protocol ProtocolBossToWorker <NSObject>

- (void)driveCar:(int)time;

@end

(2)ProtocolWorkerToBoss文件

#import <Foundation/Foundation.h>

@protocol ProtocolWorkerToBoss <NSObject>

- (void)payMoney:(int)money;

@end

(3)Boss.h文件

#import <Foundation/Foundation.h>
#import "ProtocolBossToWorker.h"
#import "ProtocolWorkerToBoss.h"
@interface Boss : NSObject<ProtocolWorkerToBoss>

@property (retain,nonatomic)id <ProtocolBossToWorker>agent;
@property (assign,nonatomic)int timeOfDrive;

- (void)payMoney:(int)money;

- (void)getDrive;

@end

(4)Boss.m文件

#import "Boss.h"

@implementation Boss

- (void)payMoney:(int)money{
    NSLog(@"boss pay the money %d",money);
}

- (void)getDrive{
    if ([self.agent respondsToSelector:@selector(driveCar:)]) {
        [self.agent driveCar:_timeOfDrive];
    }
}

@end

(5)Worker.h文件

#import <Foundation/Foundation.h>
#import "ProtocolBossToWorker.h"
#import "ProtocolWorkerToBoss.h"
@interface Worker : NSObject<ProtocolBossToWorker>

@property (retain,nonatomic)id <ProtocolWorkerToBoss>agent;
@property (assign,nonatomic)int money;

- (void)driveCar:(int)time;

- (void)getPay;
@end

(6)Worker.m文件

#import "Worker.h"

@implementation Worker

- (void)driveCar:(int)time{
    NSLog(@"drive for %d hours",time);
    _money = time*5;
}

- (void)getPay{
    if ([self.agent respondsToSelector:@selector(payMoney:)]) {
        [self.agent payMoney:_money];
//        [self.agent payMoney:[self driveCar:self.boss.timeOfDrive]];
    }
}
@end

(7)main.m文件

#import <Foundation/Foundation.h>
#import "Boss.h"
#import "Worker.h"

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

    @autoreleasepool {
        Boss *boss = [[Boss alloc]init];
        Worker *worker = [[Worker alloc]init];
        boss.agent = worker;
        boss.timeOfDrive = 100;
        worker.agent = boss;
        [boss getDrive];
        [worker getPay];
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

IOS代理协议与委托

总结delegate和protocol关系拿来给大家分享一下:把自己不想干的一些事情(洗衣做饭)找个助手来帮助你做,而你要的这个助手得有一定的能力,不是任何一个人都可以的,所以你就得有个招聘要求。协议...
  • ab20514
  • ab20514
  • 2015年10月28日 23:27
  • 249

OC 代理 协议 委托 数据源的概念

(网摘) OBJC 中的 protocol 相当于 java 里的接口,delagate 就是接口的实现类(C中的回调类似 ); 数据源就是对象遵循了存储数据的协议,可以存...

iOS开发-Protocol协议及委托代理(Delegate)传值

前言:因为Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来代替。Protocol(协议)只能定义公用的一套接口,但不能提供具体的实现方法。也就是说,它只告诉你要做什么,但...

Objective-C中的协议和代理(委托)设计模式

一、协议:          Objective-C中的协议(Protocol)类似于常用的接口,协议(Protocols)中定义的方法,在类中实现。协议(Protocol)通常用来实现委托对象(D...

iphone开发中,委托、代理、协议、数据源等几个重要概念

Objective-C语法讲座(重要) http://www.cocoachina.com/newbie/basic/2011/1026/3422.html ...

iOS开发-Protocol协议及委托代理(Delegate)传值

前言:因为Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来代替。Protocol(协议)只能定义公用的一套接口,但不能提供具体的实现方法。也就是说,它只告诉你要做什么,但...

自学iOS开发系列----OC(协议和委托代理)

协议 1.协议是OC的一种语法。OC的协议,类似于JAVA中接口,用来规范函数声明,实现多继承或对象间通信的一种语法。2.协议的两种写法 ①command+N新建协议类(HTProtocol) ...

OC 代理 协议 委托 数据源的概念

转载自http://www.devdiv.com/home.php?mod=space&uid=12744&do=blog&id=6075 OBJC 中的 protocol 相当...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:协议,委托与代理
举报原因:
原因补充:

(最多只允许输入30个字)