@protocol协议定义和遵守

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/leo628/article/details/50231997

@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;
}
展开阅读全文

没有更多推荐了,返回首页