借鉴了网络资料,总结了下协议的作用以及用法。
1、协议是一组通讯协议,一般用作两个类之间的通信。
2、协议声明了一组所有类对象都可以实现的接口。
3、协议不是类,用@protocol关键字声明一个协议。
4、与协议有关的两个对象,代理者和委托者。
5、代理,实现协议的某个方法,相当于实现这个协议。
6、委托,用自己的方法,指定要实现协议方法的对象(代理),代理来实现对应的方法。
其中,两个预编译指令,@optional:表示可以选择实现的方法。
@required:表示强制执行的方法。
贴一个小例子。
协议: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;
//在委托设置代理类