------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
一.概述
协议(protocol):规定的一组方法方法的声明,当你必需完成一个或几个特定的任务时候就该用到协议了。
委托(delegate):就是把这几个特定的任务交付给这个对象完成。
有一个老板(BOSS)需要聘请清洁员(Cleaner),这个清洁员需要完成扫地(cleanFloor),倒垃圾 (takeOutTrash)等任务(Task)。
清洁员这个就属于委托对象了,而清洁员需要完成的这些个扫地,倒垃圾等任务就属于协议。
二.协议和委托的声明
1. 使用可视化界面创建一个协议:
2. 编写协议的内容:
3. 实现委托
3.1 委托可以实现多个协议
3.2 委托实现协议要做的事情
4. 管理者使用委托
5. main函数
源代码如下:
//
// Task.h
// protocol
//
// Created by AndyJerry on 14-12-19.
// Copyright (c) 2014年 AndyJerry. All rights reserved.
//
#import <Foundation/Foundation.h>
//协议的声明
@protocol Task <NSObject>
//必须要实现的方法用@required声明
@required
-(void) cleanFloor;
-(void) takeOutTrash;
//可以不实现的方法用optional声明
@optional
-(void) cook;
@end
#import <Foundation/Foundation.h>
@protocol Task;
//@protocol Task2;
@interface Cleaner : NSObject<Task>
//实现多个协议
//@interface Cleaner : NSObject<Task, Task2>
@end
//也可以在一个类中定义协议,不过建议写在一个单独的头文件中
@protocol Task2 <NSObject>
-(void)rest;
@end
//委托
#import "Cleaner.h"
#import "Task.h"
@implementation Cleaner
//实现必须完成的任务 实现协议
-(void)cleanFloor {
NSLog(@"Boss, I'm cleaning");
}
-(void)takeOutTrash {
NSLog(@"Boss, I'm taking out trash");
}
@end
#import <Foundation/Foundation.h>
@class Cleaner;
@protocol Task;
@interface Boss : NSObject
//@property中声明的属性也可用做一个遵守协议的限制
@property (retain, nonatomic) Cleaner<Task> *cleaner;
@end
#import "Boss.h"
#import "Cleaner.h"
#import "Task.h"
@implementation Boss
@end
#import <Foundation/Foundation.h>
#import "Task.h"
#import "Cleaner.h"
#import "Boss.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
Cleaner *cleaner = [[[Cleaner alloc] init] autorelease];
Boss *boss = [[Boss alloc] init];
boss.cleaner = cleaner;
[cleaner release];
[boss.cleaner cleanFloor];
[boss.cleaner takeOutTrash];
[boss release];
}
return 0;
}