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   //協議名

   methodDeclaration;        //方法名
  @end
  2、如何使用協議
  而在類聲明時,語法如下:

  @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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM