协议的声明看起来比较类似于Java中一个类的接口,但是和接口不同的是:协议没有父类也不能定义实例变量。
1. 基本用途
1.1 可以用来声明一大堆方法(不能声明成员变量)
1.2 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明
1.3 只要父类遵守了某个协议,就相当于子类也遵守了
2.关键子:
2.1 协议的关键字
@required:表示必须强制实现的方法
@optional:表示可以有选择性的实现方法
2.2 协议的实现方式
@protocol MyProtocol <NsObect>
//可以选择实现的方法:
@optional
-(void) optionalMethod1;
-(void) optionalMethod2;
//必须实现的方法:
@required
-(void) requiredMethod1;
@end
@implementation Test
-(void)optionalMethod1{
//可选择实现方法1
}
-(void)optionalMethod2{
//可选择实现方法2
}
-(void)requiredMethod1{
//必须是实现方法2
}
@end
3. 基协议
3.1 NSObject是一个基类,最根本最基本的类,任何其他类最终都要继承它
3.2 其实还有一个协议,名字也叫NSObject,它是一个基协议,最根本最基本的协议
3.3 NSObject协议中声明很多最基本的方法,比如description、retain、release等
4. 代理设计模式
4.1 设计原理,有些麻烦的事情不想自己亲自做,就可以找个人帮忙做,即交给代理对象去做
4.2 设计原则,首先一个类里面的这个成员必须实现了这个协议才可以.
4.3 我们来实现一个模式为:妈妈把孩子交给保姆照顾
1.定义一个保姆协议:
@protocol Job <NSObject>
-(void)takeEat;
-(void)takeSleep;
-(void)takePlay;
-(void)takeShower;
@end
我们再声明Nurse类 即代理的人:
@interface Nurse : NSObject<Job>//实现该协议
@end
实现文件:
#import "Nurse.h"
@implementation Nurse
-(void)takeEat
{
NSLog(@"小孩饿了,喂它吃饭");
}
-(void)takeSleep
{
NSLog(@"小孩困了,哄他睡觉");
}
-(void)takePlay
{
NSLog(@"小孩醒来了,陪他玩");
}
-(void)takeShower
{
NSLog(@"晚上给小孩洗澡");
}
-(void)dealloc
{
NSLog(@"Nurse is dealloc");
}
@end
再声明一个morther类:
#import <Foundation/Foundation.h>
#import "Job.h"
@class Nurse;
@interface Morther : NSObject
{
NSString *name;
id<Job> delegate; //此处声明一个代理人,从而mother可以让代理人完成需要代理的事情
}
-(id)initWithName:(NSString *)_name delagat:(id<Job>)_delagete; //传入代理人
@property(nonatomic,copy)NSString *name;
-(void)delagateThings;// 被代理的事情
@end
//实现文件
#import "Morther.h"
#import "Nurse.h"
@implementation Morther
-(id)initWithName:(NSString *)_name delagat:(id)_delagete
{
self=[super init];
if (self) {
if (name!=_name) {
[name release];
name=[_name copy];
[delegate release];
delegate=[_delagete retain];
}
}
return self;
}
@synthesize name;
-(void)dealloc
{
[name release];
[delegate release];
NSLog(@"host is dealloc");
}
-(void)delagateThings
{
int i;
switch (i) {
case 1:
[delegate takeEat];
break;
case 2:
[delegate takePlay];
break;
case 3:
[delegate takeShower];
break;
case 4:
[delegate takeSleep];
break;
default:
break;
}
i++;
}
@end
int main (int argc, const char * argv[])
{
@autoreleasepool {
NSString *name=[[NSString alloc] initWithFormat:@"小花"];
Nurse *fengjie=[[Nurse alloc] init];//代理人 fengjie
Morther *morther=[[Morther alloc] initWithName:name delagat:fengjie];//这样就将代理人传入mother 对象中,这样morther对象便可以通过nurse来完成她自己不能坐的事情了。
[name release];
[morther delagateThings];
[morther release];
[fengjie release];
}
return 0;
}
所以我们代理模式要通过协议来完成