协议protocol和代理delegate的使用
这里的协议是独立的,不再类里面,所以每个类的头文件都要引入#import "MarryProtoco.h"头文件。。
首先新建一个协议 Protocol:MarryProtoco 里面写代理人要执行的方法,或者可选方法
#import<Foundation/Foundation.h>@protocolMarryProtoco<NSObject>//代理人中必须要执行的。//做饭-(void)cook;//洗衣服-(void)washCloth;//看孩子-(void)lookAfterChild;//代理人中可选执行的@optional//交朋友-(void)makeFriend;@end
然后在新建一个老大类,老大类就这让代理人执行方法的类--这里新建的是Boy类
Boy.h文件代码
#import<Foundation/Foundation.h>#import"MarryProtoco.h"//Boy引入协议@interfaceBoy:NSObject{NSString*_name;//id<MarryProtoco>_delegate;}@property(nonatomic,copy)NSString*name;@property(nonatomic,assign)id<MarryProtoco>delegate;//这里因为是id类型的,所以用assign,并且这里只能上面id<MarryProtoco>_delegate;同时存在一者,否则会报错。-(instancetype)initWithName:(NSString*)name;//代理人是在老大里面设置的//-(void)setDelegate:(id<MarryProtoco>)delegate;-(void)work;-(void)eat;-(void)play;@end
Boy.m文件代码
#import"Boy.h"@implementationBoy@synthesizename=_name;-(instancetype)initWithName:(NSString*)name//这里这样写是不对的,因为在.h中name是copy类型,如果这样写话是assign类型的写法。应该改成注释后的写法{self=[superinit];if(self){//_name=name;[selfsetName:name];//这个才是copy类型变量的写法。。。。可懂?}returnself;}-(void)setDelegate:(id<MarryProtoco>)delegate{_delegate=delegate;}-(void)work{NSLog(@"%@我要去工作了,早点在家做饭,",_name);[_delegatecook];}-(void)eat{NSLog(@"%@,我要出去吃饭了,你在家给我好好看孩子",_name);[_delegatelookAfterChild];}-(void)play{NSLog(@"%@,我要出去玩耍,这些衣服脏了,怎么办?",_name);[_delegatewashCloth];}@end
创建代理类Girl,来执行协议中的方法
Gril.h文件代码
#import<Foundation/Foundation.h>#import"MarryProtoco.h"//Gril引入协议@interfaceGirl:NSObject<MarryProtoco>{NSString*_name;}@property(nonatomic,copy)NSString*name;-(instancetype)initWithName:(NSString*)name;//代理人必须执行协议里面的全部方法即MarryProtoco里面的方法//代理人中@optional里面的方法是可选的,可以执行也可以不执行。-(void)cook;-(void)lookAfterChild;-(void)washCloth;@end
Gril.m文件代码
#import"Girl.h"@implementationGirl@synthesizename=_name;-(instancetype)initWithName:(NSString*)name{self=[superinit];if(self){//_name=name;[selfsetName:name];}returnself;}-(void)cook{NSLog(@"%@我去给您做饭,你别急,马上好",_name);}-(void)lookAfterChild{NSLog(@"%@说,好睇,我去看孩子,你去玩吧,玩得开心哦。",_name);}-(void)washCloth{NSLog(@"%@说,恩恩,您衣服脏了,我去给你洗洗,嘻嘻,",_name);}@end
main.m主函数中的代码写法
#import<Foundation/Foundation.h>#import"Girl.h"#import"Boy.h"#import"MarryProtoco.h"intmain(intargc,constchar*argv[]){@autoreleasepool{/*凡事符合系统默认setter、getter书写格式的方法,都可以使用点语法例如:[personsetName:@“zhangsan”];可以等价写成person.name=@“zhangsan”;NSString*name=[personname];可以等价写成NSString*name=person.name;属性是一对getter、setterfangfa,点语法是属性的另一种调用格式*///Girl*mm=[[Girlalloc]initWithName:@"妹妹"];Girl*mm=[[Girlalloc]init];mm.name=@"妹妹";//Boy*gg=[[Boyalloc]initWithName:@"哥哥"];Boy*gg=[[Boyalloc]init];gg.name=@"哥哥";[ggsetDelegate:mm];//设置代理人,[ggwork];[ggplay];[ggeat];//每次只能存在一个代理人,如果想换代理人,就必须让现有的死了,然后在设置代理人}return0;}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。