1、协议:协议不是类,是一种约定,他声明的方法和属性,都是独立于其他任何特定的类,并本身不会去实现他,让使用他的类去实现他,比如UITableView,需要实现他的cellForRowAtIndexPath等协议,谁用谁知道。
协议的两个预编译指令@optional:可以选择的方法。@required:必须执行的方法。
我们打开UITableView的头文件,看下他的声明:
@protocol UITableViewDataSource<NSObject> @required - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section; // Row display. Implementers should *always* try to reuse cells by setting each cell‘s reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier: // Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls) - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
可以看到,这些方法是协议要求你必须实现的。
现在来看看写周报的事,
我们新建一个类,Work
在Work.h头部申明要写周报(协议)
Work.h:
#import <Foundation/Foundation.h> @protocol Weekly <NSObject>; @required -(NSString *)Progress; @optional -(NSString *)Advice; @end @interface Work : NSObject @end
Weekly协议里面有个方法,就是Progress"进度",而且是@required的强制要求实现的
还有一个方法 Advice "建议",是@optional可实现可不实现
2、委托
假设主管是A类
A.h里面:
#import "Work.h" @interface A : NSObject //定义一个委托代理 @property (nonatomic) id <Weekly> delegate; @end
@property (nonatomic) id <Weekly> delegate;
就像主管开会,宣布了一个任务 :delegate,这个任务就是要写周报 :<Weekly>
接下来分配
员工B类、C类、D类等,我就指写一个B类做例子
A.m里面:
#import "A.h" //导入B #import "B.h" @implementation A -(instancetype)init{ self = [super init]; //实例化员工B B* b = [[B alloc] init]; //设置代理的实现者是B员工对象,等于分配任务给他 self.delegate = b; //主管查看B员工的周报 NSString* B_Progress = [b Progress]; NSString* B_Advice = [b Advice]; NSLog("%@",B_Progress); NSLog("%@",B_Advice); return self; }
我们会发现self.delegate = b; 会有警告,为什么呢?因为B员工现在还只是员工B,不是已经投入写周报的B员工,因为他还没接受你这个任务,是不是?我做不做那是我的事,你交代给我我不做,那你就麻烦了,我可以不写,大不了不干是吧?跟上级有冲突的屌丝就是这样,各种理由各种反驳,如果B接受任务,就要受写周报约束,来看下
B.h里面:
//导入协议类 #import "Work.h" //<Weekly>遵循周记的协议,必须写周记 @interface B : NSObject <Weekly> @end
B.m里面实现:
//周记必须写的内容 -(NSString *)Progress{ return @"xxx项目进度达到90%!"; } //可写可不写的内容 -(NSString *)Advice{ return @"主管英明神武,没有意见!"; }
这样,B类就实现了协议的内容,完成了主管分配的任务,并返回结果。如果不实现Progress,xcode会报警告,你没有实现这两个代理。
时间: 2024-12-27 10:14:39