@protocol(协议)类似于JAVA的interface(接口),不同的是协议的方法可以不实现也可运行程序,java接口没有实现会报错导致程序无法运行。
PS:这是由于oc属于弱语法类型
协议中不可声明实例变量,只有声明方法且不能实现方法,遵守协议的类表示该类已经包含该协议的方法声明,只需要在类对应的.m文件中实现便可;
@protocol协议定义可定义在单独的文件中以delegate(代理)结尾的.h文件中也可定义在类的声明文件中,由于协议常常与代理挂钩,所以多数协议以delegate结尾
协议定义格式如下:
1、协议定义格式:
@protocol<NSObject> //<NSObject>表示遵守NSObject基协议,协议可互相遵守,属于协议扩展,多个协议可在<xxx,xxx,xxx,xxx>括号内使用逗号分隔开,
//声明方法列表
//[]中表示选择性的添加,可以不添加
[@required(默认)] //协议关键字
//要求实现的方法列表,不实现会发出警告,由于oc是弱语法类型,所以程序会执行
[@optional] //协议关键字
//不要求实现的方法选择性实现
@end
2、协议的遵守(使用)格式:分两种:协议遵守协议(属于协议的扩张方式),类遵守协议(属于协议的使用)
//@protocol协议遵守协议格式
@protocol协议名称<其它协议名称,其他协议。。。>
//方法列表
@end
//@protocol类遵守协议格式
@interface 类名:父类名称<协议名称1,协议名称2,......>
//方法列表
@end
PS:遵守协议前需要在@interface前使用@protocol指令声明协议这与@class意义相同,只是告诉编译器有名为xxx这样的东西,但没有引入实体;
格式:@protocol 协议名称;
在所遵守协议类对应的@implementaion前面使用#import 引入所遵守的协议的实体
格式:#import "协议名称.h"
协议中文字面浅理解:代表一方或多方在相同意见下达成共同遵守的规范
在oc中代理和协议两者有着某种特定的联系,一个类需要另外一个类去帮助它实现一些功能(去做一些事情)但是两者之间没有继承或者是分类等任何的关系,这种情况下oc使用协议作为两个类之间的沟通桥梁,用协议让一个类写出它需要其他类帮他实现什么功能,其他类可以实现它需要的功能就可以成为该类的代理,两者之间通过协议沟通。使用代码实现如下:
1、定义协议
MyProtocolDelegate.h
#import <Foundation/Foundation.h>
@protocol MyProtocolDelegate<NSObject>
-(void)haha;
-(void)money;
@end
2、需求类摆出协议
myClass.h
#import<Foundation\Foundation.h>
@protocol MyProtocolDelegate;
//声明protocol协议
@interface myClass : NSObject
@property(nonatomic,strong) id<MyDelegate> _delegate_obj;
//创建代理对象属性,必须是遵守MyDelegateProtocol协议的对象才能成为myClass的代理
@end
myClass.m
#import "myClass.h";
@implementation myClass
@end
3、代理者
myDelegate.h
#import<Foundation\Foundation.h>
@protocol MyProtocolDelegate;
@interface myDelegate :NSObject<MyProtocolDelegate>
@end
myDelegate.m
#import<Foundation\Foundation.h>
#import "MyProtocolDelegate.h";
@implementation myDelegate
-(void)haha{
NSLog(@"我是代理者方法哈哈");
}
-(void)money{
NSLog(@"我是代理者方法money");
}
@end
4、代理的实现
#import <Foundation\Foundation.h>
#import "myClass.h";
#import "myDelegate";
int main(){
@autorelease{
myClass *myclass=[[myClass alloc] init];
myclass.
_delegate_obj=[[myDelegate alloc] init];
[
myclass._delegate_objhaha];
[myclass._delegate_objmoney];
}
return 0;
}