在学习oc的过程中,协议以及代理的概念遇上一些问题,现在终于理清了,所以在这里分享下
先看下概念:
-
Protocol翻译过来, 叫做”协议”
- 在写java的时候都会有接口interface这个概念,接口就是一堆方法的声明没有实现,而在OC里面Interface是一个类的头文件的声明,并不是真正意义上的接口的意思,在OC中接口是由一个叫做协议的protocol来实现 的
- protocol它可以声明一些必须实现的方法和选择实现 的方法。这个和java是完全不同的
-
Protocol的作用
- 用来声明一些方法
- 也就说, 一个Protocol是由一系列的方法声明组成的
假设我们要踢球,运动员有踢的动作,然后球就会飞起来
分析下,这应该包含两个类,运动员和球,运动员踢球的动作就相当于委托代理球自己飞起来,踢的动作相当于一个出发点。
首先,我们需要创建一个协议,Command+N,选择Objective-C File,File Type选择protocol。
这是协议myProtocol的文件
#import <Foundation/Foundation.h>
//定义一个协议
@protocol footballProtocol <NSObject>
//协议不能包含成员变量
//定义协议方法
@required
//required关键字表示该方法必须实现,不实现不会报错但是会报警告,默认是required
-(void)fly;
@optional
//optional表示该方法可以选择实现或者不实现,不会报错不会报警告也
-(void)goalScore;
@end
有了协议,咱们就需要类来去遵守这个协议,相当于java中定义了interface接口就要有implementation实现接口接下来创建球类Command+N 选择cocoa class
定义球类ball的声明文件
#import <Foundation/Foundation.h>
#import "footballProtocol.h"
//声明类ball遵守协议footballProtocol
@interface ball : NSObject<footballProtocol>
//声明球类旋转的方法
-(void)rotate;
@end
实现协议myProtocol和ball非正式协议自身的方法,在ball.m中去操作#import "ball.h"
@implementation ball
//ball自身的方法
-(void)rotate{
NSLog(@"我转,我一直转!!!");
}
//遵守协议实现的方法
-(void)fly{
NSLog(@"飞向球门,go!!!");
}
-(void)goalScore{
NSLog(@"进球啦,得分了!!!");
}
@end
接下来我们应该创建运动员类player,player类要让球类ball替自己去完成飞的动作,首先就需要也遵守footballProtocol协议,还需要设置属性返回一个遵守该协议的对象,注意,delegate并不是关键词,可以用其他单词。#import <Foundation/Foundation.h>
#import "footballProtocol.h"
//定义player遵守footballProtocol协议
@interface player : NSObject<footballProtocol>
//设置属性 要遵守协议的对象
@property(nonatomic,strong) id<footballProtocol> delegate;
//player自身的方法
-(void)eat;
@end
player类同样遵守协议,对于协议中@required的方法必须实现,下面是player.m文件#import "player.h"
@implementation player
@synthesize delegate=_delegate;
-(void)eat{
NSLog(@"踢球要补充能量,赶紧吃吃吃!!!");
}
//实现方法 通过代理去调用ball实现的方法
-(void)fly{
[_delegate fly];
}
-(void)goalScore{
[_delegate goalScore];
}
@end
最后的main文件是见证奇迹的时刻#import <Foundation/Foundation.h>
#import "ball.h"
#import "player.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
//实例化对象并初始化
ball *b=[[ball alloc]init];
player *p=[[player alloc]init];
//设置代理
p.delegate=b;
[p eat];
[p fly];
[b rotate];
//代理对象的方法只能自己去调用
[p goalScore];
}
return 0;
}
运行的结果如图