ios中的协议

本文详细介绍了Objective-C中的协议概念,包括非正式协议和正式协议的区别、如何定义和使用协议、以及协议在实际开发中的作用。通过实例展示了如何利用协议实现委托模式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

协议的概述:

  协议分为非正式协议和正式协议,从写法上的区别在于非正式协议使用@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预编译指令:表示必须强制实现的方法.





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值