一、協議:
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協議的。
二、代理(委託)設計模式
- 簡化了對象的行爲,最小化了對象之間的耦合度。
- 使用代理,一般來說無需子類化。
- 簡化了我們應用程序開發,既容易實現,有靈活。
@implementation
-(void)init
{
delegate = B;
}
-(void)FunToOther
{
[delegate Fun];//將消息發送給委託去處理
}
@end
@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這件事情了。
例子參考:http://www.cnblogs.com/cokecoffe/archive/2012/05/05/2537109.html