借鑑了網絡資料,總結了下協議的做用以及用法。網絡
一、協議是一組通信協議,通常用做兩個類之間的通訊。ui
二、協議聲明瞭一組全部類對象均可以實現的接口。atom
三、協議不是類,用@protocol關鍵字聲明一個協議。spa
四、與協議有關的兩個對象,代理者和委託者。.net
五、代理,實現協議的某個方法,至關於實現這個協議。代理
六、委託,用本身的方法,指定要實現協議方法的對象(代理),代理來實現對應的方法。對象
其中,兩個預編譯指令,@optional:表示能夠選擇實現的方法。接口
@required:表示強制執行的方法。字符串
貼一個小例子。get
協議:SetStringDelegate
#import <Foundation/Foundation.h>
@protocol SetStringDelegate <NSObject>
- (NSString *)getString;
委託類
RootViewController.h
#import <UIKit/UIKit.h>
#import "SetStringDelegate.h"
@interface RootViewController : UITabBarController
@property (nonatomic)id<SetStringDelegate>delegate;
RootViewController.m
- (void)secondView
{
SecondViewController * second = [[SecondViewController alloc] init];
[self.navigationController pushViewController:second animated:YES];
[second release];
}
- (void)viewDidLoad
{
[superviewDidLoad];
UIBarButtonItem * rightItem = [[UIBarButtonItem alloc] initWithTitle:@"next"style:UIBarButtonItemStyleDone target:self action:@selector(secondView)];
self.navigationItem.rightBarButtonItem = rightItem;
[rightItem release];
SecondViewController * second = [[SecondViewController alloc] init];
self.delegate = second;//指定代理對象爲,second
NSString * str = [self.delegate getString];//這裏得到代理方法的返回值。
[second release];
}
代理類
SecondViewController.h
#import <UIKit/UIKit.h>
#import "SetStringDelegate.h"
@interface SecondViewController : UITabBarController<SetStringDelegate>
並在SecondViewController.m中實現代理方法
- (NSString *)getString
{
return @"test";//返回一個test字符串。
}
一個簡單的代理回調
也能夠把代理對象設置爲自身,能夠在自身中實現協議方法。
這簡單的兩個類傳值,能夠用或不用代理,複雜的項目中,好比第三個類要獲得協議方法的返回值。
用代理會比較方便。
其中項目中用到一個組合的概念,至今不太明白,代碼先貼出來
#import <Foundation/Foundation.h>
#pragma mark -
#pragma mark delegate
//一個協議方法
@protocol MSCNodeAttributeSetterDelegate <NSObject]]>
- (void) reloadWithAttribute_Style;
#pragma mark -
#pragma mark class
//提供一組接口,可是,又不是協議
@protocol MSCNodeAttributeSetter
@property (nonatomic, assign) id<MSCNodeAttributeSetterDelegate> AttributeSetDelegate;
//在這,只要引入這個接口,能夠做爲一個委託。其中引入接口也用<MSCNodeAttributeSetter>
- (void) setAttribute_Style:(NSString *)style;
//在委託設置代理類