转iOS中delegate、protocol的关系
刚开始接触iOS,对delegate、protocol这两个概念比较模糊。参考了一些资料,记录下来体会。
1.protocol
@protocol myProtocol <NSObject> @required
- (int)add:(int) a and:(int)b; @optional
- (int)minus:(int)a and:(int)b; @end
这里还有两个关键字,@required和@optional,一个是必须实现的,一个是可选的。可以根据名字直接判断。
@interface text : NSObject<myProtocol> @end
定义一个类来使用protocol,用尖括号(<...>)括起来的就是我们定义的protocol,如果要采用多个Protocol,可以在尖括号内引入多个Protocol名称,并用逗号隔开即可。
@implementation text
- (int)add:(int)a and:(int)b{
return a + b;
}
- (int)minus:(int)a and:(int)b{
if (a >= b) {
return a - b;
}
else
return b - a;
}
@end
iOS中Protocol和Java语言中的interface很类似,如果一些类之间没有继承关系,但是又具备某些相同的行为,则可以使用Protocol来描述它们的关系。不同的类,可以遵守同一个Protocol,在不同的场景下注入不同的实例,实现不同的功能。Cocoa框架中大量采用了这种模式实现数据和UI的分离。例如UIView产生的所有事件,都是通过委托的方式交给Controller完成。根据约定,框架中后缀为Delegate的都是Protocol,例如UIApplicationDelegate,UIWebViewDelegate等。
2.delegate
#import <UIKit/UIKit.h> @protocol queryDelegate <NSObject>
- (NSString *)query;
@end @interface Person1 : UIViewController<queryDelegate>
@end
person.m
- (NSString *)query{
NSString * result = [NSString stringWithFormat:@"热火赢太阳:103比98"];
return result;
}
首先定义了协议与方法,代理类person1遵循这个协议,并且实现了委托方法。
#import <UIKit/UIKit.h>
#import "Person1.h" @interface Person2 : UIViewController<queryDelegate> @end
person2.m
- (NSString *)query{
NSString * data =[NSString stringWithFormat:@"詹姆斯的数据是37分9篮板3助攻" ];
return data;
}
代理类person2同样遵循某个协议,并且实现了委托方法。
#import <UIKit/UIKit.h>
#import "Person1.h"
#import "Person2.h"
@interface delegateViewController : UIViewController @property (weak,nonatomic) id<queryDelegate> delegate;//声明delegate - (IBAction)button1Action:(id)sender;
- (IBAction)button2Action:(id)sender;
@property (weak, nonatomic) IBOutlet UILabel *labelResult;
@property (weak, nonatomic) IBOutlet UILabel *labelData; @end
下面看delegateViewController.m:
#import "delegateViewController.h" @interface delegateViewController () @end @implementation delegateViewController @synthesize labelData;
@synthesize labelResult; .....
- (IBAction)button1Action:(id)sender { Person1 *pe1 = [[Person1 alloc] init];
self.delegate = pe1;//设置代理对象为person1
NSString * result = [self.delegate query];//通过委托变量调用委托方法
[labelResult setText:result];
} - (IBAction)button2Action:(id)sender {
Person2 *pe2 = [[Person2 alloc]init];
self.delegate = pe2;//设置代理对象为person2
NSString* data = [self.delegate query] //通过委托变量调用委托方法
[labelData setText:data]; }
委托的主要价值是让你可以在一个核心对象里定制多个对象的功能特性。
2.构建helper object 的工具 Helper Object are commonly used to add functionality to an existing class without having to subclass it.
构建helper object,helper object用来对已有的类添加功能特性而不是通过子类继承实现。
比如ClassC
@interface ClassC {
id delegate;
}
@end
首先定义一个id类型的变量,名字叫做delegate。那么ClassC的实现(.m文件)里就可以用delegate这个变量了。当然这里完全可以用其它名字而不是delegate。
@interface ClassC {
ClassB *delegate;
}
@end
这样我们知道了delegate是一个ClassB,它就可以提供ClassB里的方法。可以把一部分ClassC里的工作放在ClassB里去实现。这样的写法看起来是不是有点奇怪?或者应该写成这样?
@interface ClassC {
ClassB *classB;
}
@end
.......按照上面这样写,delegate就没有了。
protocol是一种语法,它提供了一个很方便的、实现delegate模式的机会。
比如写UITableView的时候,Apple这么干
- (void)doSomething {
[self blahblah];
[self.delegate guruguru];//放到delegate中去执行这个guruguru函数
[self blahblah];
}
delegate是我们写的类,这个类如果可以被传给UITableView做为其delegate,那唯一要求,就是它实现了
- (void)guruguru;
这个方法。
@protocol XXXProtocol - (void)guruguru; @end
就说明了,UITableView需要的delegate是一个conform to XXXProtocol的类。这就正好是id<XXXProtocol>表达的意思。
转iOS中delegate、protocol的关系的更多相关文章
- [HMLY]12.iOS中的Protocol
最近工作中遇到一个比较迷惑的事情,在我利用runtime获取类的属性的时候,由于类实现了一个自定义协议,导致遍历出来的属性中包含了NSObject协议中的property.查来查去,只是知道和prot ...
- 对iOS中Delegate的理解
首先 协议protocol 和委托delegate 是两个完全不同的概念 放在一起说 是因为我们总是在同一个头文件里看到它们: 首先解释一下什么是委托 :举个例子 ,我工作的时候给你打电话,让你帮我 ...
- 06 (OC)* iOS中UI类之间的继承关系
iOS中UI类之间的继承关系 此图可以更好的让你去理解iOS中一些底层的关系.你能够了解以及理解UI类之间的继承关系,你会更加明白苹果有关于底层的东西,更有助于你的项目开发由它们的底层关系,就能更加容 ...
- iOS 中 UIView 和 CALayer 的关系
UIView 有一个名叫 layer ,类型为 CALayer 的对象属性,它们的行为很相似,主要区别在于:CALayer 继承自 NSObject ,不能够响应事件. 这是因为 UIView 除了负 ...
- 【转】iOS开发-Protocol协议及委托代理(Delegate)传值
原文网址:http://www.cnblogs.com/GarveyCalvin/p/4210828.html 前言:因为Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来 ...
- 关于IOS中的delegate必须知道的事情
当你开始写iOS程式不久,应该开始面对到很多的delegate, 不管是用别人的library或是自己写library,可能都逃不了delegate. 为了怕有些人不知道什么是delegate,在这边 ...
- ios中关于delegate(委托)的使用心得
ios中关于delegate(委托)的使用心得 分类: iOS开发2012-05-15 10:54 34793人阅读 评论(9) 收藏 举报 iosuiviewtimerinterfaceprinti ...
- iOS开发-Protocol协议及委托代理(Delegate)传值
前言:因为Object-C是不支持多继承的,所以很多时候都是用Protocol(协议)来代替.Protocol(协议)只能定义公用的一套接口,但不能提供具体的实现方法.也就是说,它只告诉你要做什么,但 ...
- iOS中 Proxy和的delegate区别
在ios中使用proxy代理模式,经常容易和delegate委托模式混淆. 委托模式(delegate),是简单的强大的模式,可让一个对象扮演另外对象的行为.委托对象保持到另外对象的引用,并在适当的时 ...
随机推荐
- android开源项目和框架
特效: http://www.androidviews.net/ http://www.theultimateandroidlibrary.com/ 常用效果: 1. https://github.c ...
- Android 代理服务器为全网提供代理
Android 代理服务器为全网提供代理 背景:学校WiFI过滤较严,故学生很少有可以上网账号的.而学校又分为俩层验证,第一层可以注册并且拥有访问校内网的权限,第二层为校内密码验证机(非服务器)进行用 ...
- python中argparse模块的使用
有两个文件一个是 文件1:sync_shop_source_bimer.sh 文件2:sync_shop_source_bimer.py 在sync_shop_source_bimer.sh 中调用s ...
- 为PHP函数执行设置超时
如何防止一个函数执行时间过长呢?在PHP里可以用pcntl时钟信号+异常来实现. 代码如下: declare(ticks = 1); function a(){ sleep(10); echo &qu ...
- RFID 读写器 Reader Writer Cloner
RFID读写器的工作原理 RFID的数据采集以读写器为主导,RFID读写器是一种通过无线通信,实现对标签识别和内存数据的读出和写入操作的装置. 读写器又称为阅读器或读头(Reader).查询器(Int ...
- Python:如何显示进度条
首先,推荐一个组件:progressive 效果如下: 进度条和一般的print区别在哪里呢? 答案就是print会输出一个\n,也就是换行符,这样光标移动到了下一行行首,接着输出,之前已经通过std ...
- StarUml:Exception EOleSysError in module StarUML.ex
http://sourceforge.net/p/staruml/discussion/510442/thread/9fe12cac/ run as administrator.Works fine.
- Android版-支付宝APP支付
此项目已开源 赶快来围观 Start支持下吧 [客户端开源地址-JPay][服务端端开源地址-在com.javen.alipay 包名下] 上一篇详细介绍了微信APP支付 点击这里 此篇文章来详细介绍 ...
- (转)c#.net常用字符串函数
Compare 比较字符串的内容,考虑文化背景(场所),确定某些字符是否相等 CompareOrdinal 与Compare一样,但不考虑文化背景 Format 格式化包含各种值的字符串和如何格式化每 ...
- 解决genemotion模拟器冲突导致的Android Studio无法启动ADB的问题
首先命令行下运行 adb nodaemon server ./adb nodaemon server (Mac OSX) 如果出现错误: error: could not install *smart ...