IOS协议与委托
来源:互联网 发布:苹果mac使用 编辑:程序博客网 时间:2024/05/17 10:25
在IOS开发中协议和委托是两个密不可分的概念(也可以说是不同的设计模式,只不过在这里我们把他们讲在一起,因为我们常常都是这么用的):确切来说,协议[protocol]定义了一种规范,使遵循它的类具备一种能力。委托[delegate]则是制定了一种"一个类中需要做的事情交给另一个类来完成"的途径,通过委托别的类,来调用协议里的方法,委托也可以说是Object-C中实现多继承的一种方式。委托delegate:在 apple提供的IOSSDK里可以看到很多的delegate,比如我们常用的UITableView,因为我们没有源码,就没有办法知道UITableView里的所谓的cell是如何增加,删除,复用的。但开发者面对的开发要求使开发者必须具备能够操作这些cell的能力,针对这种情况,各种Delegate就显得非常重要。委托delegate是一个简单而强大的设计模式,在此模式中,可以允许一个对象代表另一个对象执行某个操作,或者相互协同操作。一个很常见的场景就是网络下载数据操作,因为网络数据下载的延迟,一般都会采取多线程的机制,等到数据下载完成之后再通知主线程完成必要的操作。在这个场景中,我们完全可以在主线程实现一个代理方法,在该方法中操作下载好的数据。协议protocol:一个完整协议定义如下:@protocol 协议名 声明方法@end其中"声明方法"可以用@required和@optional关键字修饰:@required 表示我们用到这个协议的时候必须实现这个协议的方法@optional 表示我们可选择性实现这些方法。一个类需要遵循的协议在接口声明中的<>填写即可。示例:#import @interface MyViewController : UIViewController//声明继承UIViewController类,遵循UITableViewDataSource和UITableViewDelegate协议。@property (strong, nonatomic) NSDictionary *names; @property (strong, nonatomic) NSArray *keys; @end那么我们需要在MyViewController类中实现UITableViewDataSource和UITableViewDelegate协议里面的委托方法。理解协议和委托的关系我们需要搞清楚如下几个问题:1,一个对象的委托是哪个对象,需要干什么事情;2,被委托的类需要在自身的interface中声明协议:,表示该来需要实现XXXDelega协议的方法。3,在被委托的类里定义一个委托类的对象,并设置XXX.dalegate =self。把本类设置成委托对象。然后在本类中实现协议方法。委托与协议分析示例:假设公司老板日常的工作是管理公司、起草文件和接电话。其中管理公司是老板要亲自做的。而起草文件与接电话老板希望秘书来帮忙,于是对秘书的要求就是要懂得文字编辑,要能帮助领导接电话。而这两项要求便是协议。- //制定协议
- //protocol.h
- #import
- @protocol
tekuba_net - //起草文件
- -(void)draftDocuments;
- //接电话
- -(void)tel;
- @end
-
- //秘书类
- //
Sec.h - #import
- #import
"protocol.h" - @interface
Sec : NSObject - @end
- //Sec.m
- #import
"Sec.h" - @implementation
Sec - -
(id)init - {
-
self = [super init]; -
if (self) { -
// Initialization code here. -
} -
return self; - }
- -(void)draftDocuments
- {
-
NSLog(@"sec draft documents" ); - }
- -(void)tel
- {
-
NSLog(@"sec tel" ); - }
- @end
- //老板类
- //
Boss.h - #import
- #import
"protocol.h" - @interface
Boss : NSObject - //很重要的属性-此属性对象必须实现protocol协议。在实际使用过程中常常用self.delegate
= XXX. - @property(nonatomic,retain)
id detegate; //必须有一个protocol类的对象,在实际使用过程中需要配置这里的delegate指向代理对象。 - //管理公司
- -(void)manage;
- @end
- //
Boss.m - #import
"Boss.h" - @implementation
Boss - @synthesize
detegate=_detegate; - -(id)init
- {
-
self = [super init]; -
if (self) { -
// Initialization code here. -
} -
return self; - }
- -(void)manage
- {
-
NSLog(@"boss manage" ); - }
- -(void)draftDocuments
- {
-
NSAutoreleasePool *p=[[NSAutoreleasePool alloc] init]; -
[_detegate draftDocuments]; -
[p release]; - }
- -(void)tel
- {
-
NSAutoreleasePool *p=[[NSAutoreleasePool alloc] init]; -
[_detegate tel]; -
[p release]; - }
- @end
那么老板就具有这3个方法,当调用前1个时是自己完成功能,而调用后2个时则转为委托调用秘书的方法。测试用例如下:- main.m
- #import
- #import
"Boss.h" - #import
"Sec.h" - int
main ( int argc, const char * argv[]) - {
-
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; -
//实例化老板对象 -
Boss *boss=[[[Boss alloc] init] autorelease]; -
//实例化秘书对象 -
Sec *sec=[[[Sec alloc] init] autorelease]; -
//设置老板的代理对象为秘书 -
boss.detegate=sec;//关键代码 -
//调用各个方法。 -
[boss draftDocuments]; -
[boss tel]; -
[boss manage]; -
[pool drain]; -
return 0; - }
- //制定协议
- //protocol.h
- #import
- @protocol
tekuba_net - //起草文件
- -(void)draftDocuments;
- //接电话
- -(void)tel;
- @end
-
- //秘书类
- //
Sec.h - #import
- #import
"protocol.h" - @interface
Sec : NSObject - @end
- //Sec.m
- #import
"Sec.h" - @implementation
Sec - -
(id)init - {
-
self = [super init]; -
if (self) { -
// Initialization code here. -
} -
return self; - }
- -(void)draftDocuments
- {
-
NSLog(@"sec draft );documents" - }
- -(void)tel
- {
-
NSLog(@"sec tel" ); - }
- @end
- //老板类
- //
Boss.h - #import
- #import
"protocol.h" - @interface
Boss : NSObject - //很重要的属性-此属性对象必须实现protocol协议。在实际使用过程中常常用self.delegate
= XXX. - @property(nonatomic,retain)
id detegate; //必须有一个protocol类的对象,在实际使用过程中需要配置这里的delegate指向代理对象。 - //管理公司
- -(void)manage;
- @end
- //
Boss.m - #import
"Boss.h" - @implementation
Boss - @synthesize
detegate=_detegate; - -(id)init
- {
-
self = [super init]; -
if (self) { -
// Initialization code here. -
} -
return self; - }
- -(void)manage
- {
-
NSLog(@"boss manage" ); - }
- -(void)draftDocuments
- {
-
NSAutoreleasePool *p=[[NSAutoreleasePool alloc] init]; -
[_detegate draftDocuments]; -
[p release]; - }
- -(void)tel
- {
-
NSAutoreleasePool *p=[[NSAutoreleasePool alloc] init]; -
[_detegate tel]; -
[p release]; - }
- @end
0 0
- ios委托与协议
- ios协议与委托
- iOS 协议与委托
- IOS协议与委托
- IOS协议与委托
- iOS中的协议与委托
- IOS代理协议与委托
- ios中协议与委托
- iOS中的协议与委托
- iOS中的协议与委托
- IOS代理协议与委托
- iOS中的协议与委托
- ios委托delegate与协议protocol
- ios学习(三) 谈谈协议与委托
- ios中协议与委托形象解释
- IOS学习笔记之协议与委托
- IOS开发第二天-协议与委托
- ios协议和委托
- IOS面试题大全
- [综合面试] 2014校招暑假实习生面经(阿里、百度offer)
- 赋予root权限
- Linux下安装和使用MySQL
- lua 5.1 ==> 5.2
- IOS协议与委托
- 退出游戏
- Android 应用程序发布流程注意事项(整理)
- 冒泡排序
- 关于OC的一些理论知识
- 结构体,结构体指针重新学习记录
- LeetCode N-Queens II
- Objective C实现多继承
- 几款在线代码编辑器初体验