协议的概述:
协议分为非正式协议和正式协议,从写法上的区别在于非正式协议使用@interface来定义的,而正式协议是用@protocol来定义的,虽然正式协议看上去更正规一点,语气上更强烈一点:要求采用该协议的类,"必须"实现协议中约定的方法.但是即使号称正式协议,编译器在编译时,遇到不正归的情况,仍然只是给出警告.
协议中的定义:
在.h文件中可以这样写
@protocol ContactCtrlDelegate
- (void)dismissContact;
@end
@interface ContactCtrl<NSObject>
@property(nonatomic,assign) id <ContactCtrlDelegate> delegate;
协议的作用:
正式协议可以将业务中的方法定义剥离出来,形成一个单独的文件,这跟传统OO的提取接口是不谋而合的.如果遇到两个系统需要交换数据,可以指定一套双方都遵守的protocol,然后在这两个系统中都把这个协议添加到项目中,实现它既可,这一功能,非正式协议(@interface)就做不到.
协议的使用:
举例说明
1.ContactsCtrl.h
#import<UIKit/UIKit.h>
//定义协议
@protocol ContactCtrlDelegate
- (void)DismissContactsCtrl;
@end
@interface contactsCtrl : UIViewController{
IBOutlet UINavigationBar *ContactNavBar;
}
@property(nonatomic,assign) id <ContactCtrlDelegate> delegate;
- (IBAction) canCelBtn: (id)sender;
2.ContactsCtrl.m
@implementation ContactCtrl
//implement viewDidLoad todo additional setup after loading the view, typically from a nib.
- (void)viewDidLoad{
[super viewDidLoad];
ContactNavBar.topItem.prompt = @"选取联系人发送短信";
}
//调用协议中的方法
- (IBAction)canCelBtn: (id)sender{
[delegate DismissContactsCtrl];
}
3.ProtocolDemoCtrl.h
#import<UIKit/UIKit.h>
#import"contactCtrl.h ";
@interface ProtocolDemoCtrl : UIViewController<contactCtrlDelegate>{ //添加委托}
ContactsCtrl *contactsView;
}
4. ProtocolDemoCtrl.m
#import "ProtocolDemoCtrl.h"
#define BARBUTTON(SELECTOR)[[[UIBarButtonItem alloc]initWithBarButtonSystemItem:]UIBarButtonSystemItemAdd target :self action :SELECTOR]autorelease];
@implementation protocolDemoCtrl
//Implement ViewDidLoad to do additional setup after loading the view,typically from a nib.
- (void)viewDidLoad{
[super viewDidLoad];
self.navigationItem.rightBarButtonItem = BARBUTTONADD( @selector)(addContactAction: ));
}
- (void)addContactAction: (id)sender{
ContactsCtrl *contactView = [[ContactCtrl alloc]initWithNibName: @"ContactsCtrl"bundle: nil];
self.contactsView = contactView;
contactsView.delegate = self;//设置委托
[self presentModalViewController: contactsView animated: YES];
[contactView release];
}
//实现ContactCtrlDelegate协议中的方法
- (void)DismissContactsCtrl{
[contactView dismissModalViewControllerAnimated:YES];
}
协议的说明
(1)协议声明了可以被任何类实现的方法.
(2)协议不是类,它是定义了一个其他对象可以实现的接口.
(3)如果在某个类中实现了协议中的某个方法,也就是这个类实现了那个协议.
(4)协议经常用来实现委托对象.一个委托对象是一种用来协同或者代表其他对象的特殊对象.
(5)@optional预编译指令:表示可以选择实现的方法:@required预编译指令:表示必须强制实现的方法.