Object-C学习之协议(protocol)
非正式协议(interface),但其实质仍是调用正式协议(protocal)
正式协议(protocal)可以将业务中的方法定义剥离出来,形成一个单独的文件,这跟传统OO中的提取接口是不谋而合的。如果遇到二个系统需要交换数据,可以制定一套双方都遵守的protocal,然后这二个系统中都把这个协议文件添加到项目中,实现它即可。这一功能,非正式协议(@interface)就做不到。
此外,obj-C 2.0中对正式协议还做了一些扩展,允许把正式协议中的方法标识为“必须实现(@requied)”和“可选实现(@optional)”二类,如果协议中的方法被标识为@optional,即使采用该协议的类不实现这些方法,编译器也不会给出警告。
下面的我们主要讨论正式协议的内容:
定义: 协议(protocol)类似于java语言里的接口(interface),定义了一组方法,而不提供具体实现, 只有那些“遵守”(conform to)或“采用”(adopt)了这些Protocol的类来给出自己的实现。协议不是类本身,它们仅定义了其它对象有责任实现的接口。当在自己的类中实现协议的方法时,用户的类就是遵守这个协议的,协议声明的方法可以被任何一个类实现。
1、协议的语法结构如下:
@protocol ProtocolName //协议名
@end
@interface ClassName : ParentClassName < ProtocolName>
然后在该类的实现文件中,实现该协议的方法methodDeclaration
就我个人总结来说,使用协议总的就分一下几个步骤:
1.协议声明/定义
2.调用协议
3.设置委托
4.协议的实现
实例分析:
1、ContactsCtrl.h #import <UIKit/UIKit.h> //定义协议 @protocol ContactCtrlDelegate -(void)DismissContactsCtrl; //协议中的方法 @end @interface ContactsCtrl : UIViewController { IBOutlet UINavigationBar *ContactNavBar; id <ContactCtrlDelegate> delegate; //这个必不可少 } @property (nonatomic, assign) id <ContactCtrlDelegate> delegate; -(IBAction)canCelBtn:(id)sender; @end 2、ContactsCtrl.m @implementation ContactsCtrl @synthesize delegate; //还有这里 // Implement viewDidLoad to do 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 "ContactsCtrl.h" //引入定义协议ContactsCtrlDelegate的头文件 @interface ProtocolDemoCtrl : UIViewController <ContactCtrlDelegate>{//添加委托 ContactsCtrl *contactsView; } 4、ProtocolDemoCtrl.m #import "ProtocolDemoCtrl.h" #define BARBUTTONADD(SELECTOR) [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:SELECTOR] autorelease]; @implementation ProtocolDemoCtrl @synthesize contactsView; // 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 = [[ContactsCtrl alloc] initWithNibName:@"ContactsCtrl" bundle:nil]; self.contactsView = contactView; contactsView.delegate = self; //设置委托 [self presentModalViewController:contactsView animated:YES]; [contactView release]; } //实现ContactCtrlDelegate协议中的方法 -(void)DismissContactsCtrl{ [contactsView dismissModalViewControllerAnimated:YES]; }
以上内容摘抄于网上各博客、网站。 由于内容多而杂,这里摘几句,那里来一段,我这就不一一注明博客地址了。
大部分内容来自以下两个博客:
遗失的记忆iloss 的博文: Objective-C学习总结-13协议 :
地址:http://www.iloss.me/2011/06/23/objective-c%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93-13%E5%8D%8F%E8%AE%AE/
pjk1129专栏的博文 iphone开发Objective-C新特性──类别与协议
地址:http://blog.csdn.net/pjk1129/article/details/6458644
另外一个听挺不错的网站对此也有所介绍:http://www.cocoachina.com/bbs/read.php?tid=115135