今天复习了协议的内容
理论:
什么是协议:协议就是规则,定义一个协议相当于制定规则。
OC中类可以遵守协议,遵守了一个协议的类相当于拥有了一种能力。
@protocol 协议名
@required 声明必须遵守的属性和方法
@optional 声明可选(可以)遵守的属性和方法
默认@required
@end
一个类遵守一个协议
a.@interface 类名(分类类名):父类名<协议名>
b.实现协议中声明的方法
协议的继承
协议的继承相当于协议的合并。
@protocol MyProtocalB<MyProtocalA>
-(void)learn;
@end
一个类可以同时遵守多个协议,协议之间使用“,”分隔符分开。
@interface Student:
NSObject<MyProtocolX,MyProtocolY>
协议参数
可以让某个参数为id类型但是要遵循某个协议,这样可以对参数加以限制。
比如一个方法需要一个任意类型的对象,但是要求对象必须有某个方法的时候。参数类型如下:
-(void)方法名参数介绍:(id<协议名称>obj;
例如:-(void)DanceWithObject:(id<DanceDelegate>)obj;
协议返回值类型
+(id<ButtonProtocol>)createByNum:(int)num
{
switch(num)
{
case 1:
return [[LoginButton alloc]init];
case 2:
return [[RegiterButton alloc]init];
}
return nil;
}
协议选择器
-协议的引用指向一个协议
Protocol *p = @protocol(NSCopying);
-可以判断一个类是否遵循了某个协议
BOOL b = [Student conformsToProtocol:p];
1、协议用到的情况:某个类有一个实例方法,这个实例方法对所传过来的对象,限制其必须实现了某个特定的方法,而对传过来的对象类型没有限制。
2、格式
协议名:@protocol 协议名 协议名命名一般:类名+Delegate。
协议内容:特定的某方法
具体举例:
①
Aa类中得实例方法是具有协议限制的。
Bb类是一个普通类。
②
Aa.h中:
//协议写法
@protocol AaDelegate <NSObject>
//协议内容
-(void)play;
@end
@interface Aa :NSObject
//传染的对象 遵守协议
-(void)playWithObject:(id<AaDelegate>)anyobject;
@end
Aa.m中写好带协议的实例方法
-(void)playWithObject:(id<AaDelegate>)anyobject{
[anyobjectplay];
}
③
当在ViewController中引入Aa Bb 类。
分别创建对象。Aa 类对象,调用实例方法把Bb类对象传入时报警告:要求Bb 类对象必须遵守Aa 类中实例方法的协议。
需要在Bb类的Bb.h:
引入协议所在类
#import"Aa.h"
让Bb类遵守协议:
@interface Bb :NSObject<AaDelegate>
在Bb.h中实现协议内容。
需要注意的方面: