非正式協議(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