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

 

posted @ 2012-08-20 13:19  小、  阅读(6351)  评论(0编辑  收藏  举报