Objective-C 协议和委托

版权说明:本文为原创文章,未经允许,不得转载。

协议 (protocol)

1.协议的基本概念

协议是一种特殊的程序设计结构,用于声明专门被其他类实现的方法,协议在以下场合非常有用:

· 需要由其他类实现的方法。
· 声明未知类的接口。
· 两个类之间的通信。

2.协议的定义及使用

@protocol 协议名 <父协议>

声明方法

@end

协议的有以下两个关键字

@required:表示必须强制实现的方法,默认为必须实现。
@optional:表示可以有选择性的实现方法。

协议的声明:

@protocol HelloProtocol <NSObject>

@optional
- (void)optionalMethod;

@required
- (void)requiredMethod;

@end

协议的使用

@interface Person : NSObject <HelloProtocol>

@end

以上代码,即 Person 类使用 HelloProtocol 协议。

可以将多个类中共同的方法放到协议中,让这些类都遵守这个协议,并实现协议里的方法,即可拥有这些方法,有效减少代码的重复性。

委托模式 (delegate)

1.概念

委托是指一个对象提供机会对另一个对象中的行为发生变化时做出的反应,其基本思想为,两个对象协同解决问题,通常用于对象之间的通信。

例如对象 A 有一项事情需要做,但是对象 A 不自己做,他的代理对象 B 来做。

即 A 有需求但不直接做,通过 Delegate 委托给 B 去做。

委托是 Objective-C 中的一种设计模式,它的实现与协议的使用是分不开的。

举个例子,在班级里,教师负责教导学生和批改作业,而收取作业和传达老师的消息,则有助教完成。

先定义一个助教协议:

assistantProtocol.h

#import <Foundation/Foundation.h>

@protocol assistantProtocol <NSObject>

- (void)notice;                 //通知消息
- (void)collectHomeWork;        //收取作业

@end

然后定义一个助教类:

Assistant.h

#import <Foundation/Foundation.h>
#import "assistantProtocol.h"

@interface Assistant : NSObject <assistantProtocol>  //实现 assistantProtocol 协议

@end

Assistant.m

#import "Assistant.h"

@implementation Assistant

//通知信息
- (void)notice{
    NSLog(@"Notice Message.");
}

//收取作业
- (void)collectHomeWork{
    NSLog(@"Collect the HomeWork.");
}

@end

教师类:

Teacher.h

#import <Foundation/Foundation.h>
#import "assistantProtocol.h"

@interface Teacher : NSObject

//该属性指定助教对象,此对象必须实现 assistantProtocol 协议。
@property (nonatomic, retain) id <assistantProtocol> delegate;

- (void)teach;                 //教育学生
- (void)checkHomeWork;         //检查作业
- (void)assNotice;             //委托助教通知信息
- (void)assCollectHomeWork;    //委托助教收取作业

@end

Teacher.m

#import <Teacher.h>

@implementation Teacher

- (void)teach{
    NSLog(@"Teach Students.");
}

- (void)checkHomeWork{
    NSLog(@"Check the HomeWork.");
}

- (void)notice{
    [_delegate notice];
}

- (void)collectHomeWork{
    [_delegate collectHomeWork];
}

@end

实现 main.m

#import <Foundation/Foundation.h>
#import <Teacher.h>
#import <Assistant.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //实例化教师和助教对象
        Teacher *teacher = [[Teacher alloc] init];
        Assistant *assistant = [[Assistant alloc] init];

        //设置教师对象的代理为助教
        teacher.delegate = assistant;

        [teacher teach];
        [teacher checkHomeWork];

        [teacher assNotice];
        [teacher assCollectHomeWork];
    }
return 0;
}