《培训之协议和代理》由会员分享,可在线阅读,更多相关《培训之协议和代理(6页珍藏版)》请在金锄头文库上搜索。
1、北京尚学堂提供在现实生活中我们存在各种各样的协议,但是都有一个共同点,就是拟定的协议,就要遵守,不遵守就是违约。在OC中也有协议这一个概念而且和我们现实生活中的协议的特点是类似的。有时我们自己想做什么事,但是现在没这个能力自己去做,亲力亲为,我们就需要找代理来帮我们做了。那么在OC中也有代理这个概念。下面就简单的说说OC中的协议和代理。一、协议在【iOS开发之Objective-C】对象的交互中实现了一种对象的交互的方式。在OC中还有其他方式,比如说协议,在OC中用协议来规范接口,是实现对象之间的交互的一种机制。类似于JAVA中的接口。还可以模拟多继承。协议的实现第一步:使用Xcode新建一个
2、工程;怎么新建一个工程第二步:新建一个OC文件;在这个工程里面 New Objective-C 填写文件名 在 里面选择“Protocol” 最后点击Next。第三步:“拟定”协议;假设我和某人签订和一个协议,协议里面需要我执行一个动作:每天练习一小时OC编程;那么这条协议内容就是: - (void)aDayCodeOneHour;这只是一个协议条款,协议自己本身事没有能力遵守协议或是实现协议。1. #import2. protocolMyProtocol3. -(void)aDayCodeOneHour;4. required/缺省属性,必须要实现5. -(void)show;/show是必
3、须要实现6. property(nonatomic,assign)inta;7. optional/可选实现8. -(void)show1;/show1是可实现也可不实现9. end第四步:遵守协议;新建一个Person的类,在这个类.m文件里面来实现这个方法。在实现之前需要先表明你为什么实现这个方法。那么我们就需要在Person这个类里面表明我是遵守这个协议。我们就需要在类的.h文件里面表明我是遵守这个协议的。1. #import2. #importMyProtocol.h3. interfacePerson:NSObject4. property(nonatomic,assign)inta
4、;5. end这里我们要做两件事,第一是包好协议这个头文件,第二就是interface Person : NSObject 。接下来就是协议的实现了。在Person.m这个文件中我们简单的实现一下:1. #importPerson.h2. implementationPerson3. -(void)aDayCodeOneHour4. NSLog(我的协议内容是“尚学堂最好的IOS培训机构”);5. 6. -(void)show7. NSLog(这是一个协议的例子。);8. 9. end第五步:主函数中演示1. #import2. #importPerson.h3. intmain(intarg
5、c,constcharchar*argv)4. autoreleasepool5. Person*ps=Personallocinit;6. psaDayCodeOneHour;/默认的也是必须要实现的7. psshow;/调用required修饰的一个方法8. ps.a=10;/给a赋值9. NSLog(%d,ps.a);/取a的值打印出来10. idobj=ps;/使用di的方法表明obj就是一个对象ps11. objshow;/obj也调用show这个方法12. 13. return0;14. 我们在协议MyProtocol 里面还有几句是没有说明的:required/缺省属性,必须要实
6、现- (void)show;/show是必须要实现property(nonatomic,assign)inta;optional/可选实现- (void)show1;/show1是可实现也可不实现 l例子中没实现required缺省属性,被他修饰的方法是必须要实现的;optional可选属性,被他修饰的方法可以不实现在协议中我们不能声明变量,但是我们可以使用属性的方法:property(nonatomic,assign)inta;在协议遵守方中要实现这个,也是在.h文件中粘贴一些这条语句,系统自动会给我们生产set和get方法。主函数就比较简单了,但是需要学习这一句:idobj = ps;/使
7、用id的方法表明obj就是一个对象ps的副本 objshow;/obj也调用show这个方法id的这一句,这里使用一个id类遵守MyProtocol协议的对象obj,让这个对象和对象ps指向的是同一块内存区域。怎么模拟多继承呢?其实也不难,我们可以这么实现 。其实在系统库里面也有很多这样的写法。这里我就不写了。二、代理模式什么是代理?代理模式是实现两个对象之间的交互的一种机制。在代理模式中涉及到两个对象,一个是主动方一个是被动方。主动方:拟定协议,创建一个携带协议的 id 指针(指向某个具体的代理);被动方:遵守协议,实现协议的方法。生活情境现在什么送外卖的很是多,每天路上都有很多发单的。我们
8、不想取买饭,就可以叫外卖。我们可以指定哪一家吃什么?我们也不能说拿了外卖就不给钱吧,我们还需要给商家付款。这里涉及到四个问题。我买哪一家的饭?我买什么饭?我要给卖家付款。卖家需要得到他的饭款。情境拆解后就是这么几个步骤了。.买家的需求:我要吃饭,吃哪家的什么饭呢?.买家选店铺和吃什么;.卖家给买家送饭;.买家给卖家付款;.卖家得到他的饭款。代理的实现有了这些步骤下面实现起来就不难了。#import1. /在主动方拟定协议2. protocolBuyFood3. -(void)sendFood;/卖家送餐4. -(void)getMoney:(int)money;/卖家得到饭钱5. end6.
9、interfacePerson:NSObject7. -(void)wantToEat:(NSString*)food;/买家想吃饭什么饭8. -(void)give:(int)money;/卖家给卖家多少钱9. /声明一个带有协议指针的属性10. property(nonatomic,assign)iddelegate;11. end1. #importPerson.h2. implementationPerson3. -(void)wantToEat:(NSString*)food/选好吃什么4. NSLog(顾客:我想吃%,food);5. self.delegatesendFood;6
10、. 7. -(void)give:(int)money/买家付款8. /注意这里的self.delegate9. self.delegategetMoney:money;/付款给给我送餐的卖家10. 11. end1. #import2. #importPerson.h3. interfaceRooom:NSObject4. -(void)show;5. -(void)wantToGetMyMoney;6. end1. #importRooom.h2. implementationRooom3. 4. int_money;5. 6. -(void)sendFood/卖家送餐7. NSLog(店
11、家:好的我马上给您派送);8. 9. -(void)getMoney:(int)money10. _money=money;/卖家得到饭钱就放进他自己的口袋了11. 12. -(void)wantToGetMyMoney13. /卖家想得到饭钱就需要买家付款买家付款给对应的卖家14. /这里就是代理的回调15. Person*p1=Personallocinit;16. p1.delegate=self;/注意这里的self谁调用这个方法self就是谁17. p1give:15;/give是主动方的方法买家付款15元18. 19. -(void)show20. NSLog(店家:我得到了我的m
12、oney:%d,_money);21. 22. end23. #import24. #importPerson.h25. #importRooom.h26. intmain(intargc,constcharchar*argv)27. autoreleasepool28. Person*per=Personallocinit;29. Rooom*roo=Rooomallocinit;30. perwantToEat:鱼香肉丝饭;/我想吃鱼香肉丝饭31. per.delegate=roo;/指定代理设置代理选店铺32. roosendFood;/卖家送餐33. roowantToGetMyMoney;/买家付款卖家得到饭钱34. ro