一、协议:
Objective-C中的协议(Protocol)类似于常用的接口,协议(Protocols)中定义的方法,在类中实现。协议(Protocol)通常用来实现委托对象(Delegate Object)。委托对象(Delegate Object)一般用来自己定义行为或者动作,也就是调用自己定义方法,但自己不实现该方法,委托其它的类来实现该方法。
1. 协议的声明:
HelloProtocol.h
#import <Foundation/Foundation.h>
@protocol HelloProtocol <NSObject>
- (void) requiredMethod;
@optional
- (void) optionalMethod1;
- (void) optionalMethod2;
@end
@required是缺省值,是必须实现的方法,@optional是可以选择的。协议只有一个.h文件,本身不是类,他是定义了一个其他类可实现的接口。
2. 协议的实现:
Person.h
#import <Foundation/Foundation.h>
#import "HelloProtocol.h"
@interface Person : NSObject <HelloProtocol>
@end
Person.m
#import "Person.h"
@implementation Person
- (void)requiredMethod{
NSLog(@"这是一个必须实现的方法");
}
- (void)optionalMethod1{
NSLog(@"这是一个可选的方法1");
}
- (void)optionalMethod2{
NSLog(@"这是一个可选的方法2");
}
@end
3. 用协议修饰变量
3.1 定义变量:
id<MyProtocolName>myNewVariable;
那么myNewVatiable是遵循我们定制的这个MyProtocolName协议的。
3.2 定义函数:
- (void) doSomethingWithThisObject: (id<MyprotocolName>) aObject
那么这个函数的参数是需要遵循我们定制的这个MyProtocolName协议的。
二、代理(委托)设计模式
代理是指一个对象提供机会给另一个对象中的行为发生变化是做出的反应。基本思想是:两个对象协同解决问题,通常用于对象之间的通信。
代理设计模式的基本特点:
- 简化了对象的行为,最小化了对象之间的耦合度。
- 使用代理,一般来说无需子类化。
- 简化了我们应用程序开发,既容易实现,有灵活。
例子:
A.h------------------------------------------------
@implementation
-(void)init
{
delegate = B;
}
-(void)FunToOther
{
[delegate Fun];//将消息发送给委托去处理
}
@end
A.m---------------------------------------------
B.h---------------------------------------------
这样的话A就可以委托B去做fun这件事情了。
@implementation
-(void)init
{
delegate = B;
}
-(void)FunToOther
{
[delegate Fun];//将消息发送给委托去处理
}
@end
委托对象的实现
B.h---------------------------------------------
#import"A.h"
@interface B:NSObject<MyDelegate>
@end
B.m---------------------------------------------
@implementation
-(void)fun
{
//实现Mydelegate中制定的方法
}
@end
这样的话A就可以委托B去做fun这件事情了。
UIApplication类就是一个典型的例子。UIApplication类中定义了一个应用程序应有的行为或者动作。而不是强制让你的UIApplication子类去接受当前应用程序的状态消息并做出相应处理。UIApplication类通过调用特殊的方法,来传递这些消息给它的委托对象。这个委托对象通过实现名为UIApplicationDelegate的协议(Protocol),之后就可以接受到当前应用程序的状态消息并做出相应处理。比如内存不够的错误,应用程序被中断等重要消息。
例子参考:http://www.cnblogs.com/cokecoffe/archive/2012/05/05/2537109.html