您的位置:首页 > 产品设计 > UI/UE

Protocol 协议

2017-04-25 11:43 113 查看

protocol基本概念

类似于java的接口interface,接口就是一堆方法的声明,没有实现,而在OC中interface是一个类的头文件的声明,并不是真正意义上的接口的意思,在OC中接口是由一个叫做协议的protocol来实现

protocol它可以声明一些必须实现的方法

protocol由一系列的方法声明组成

protocol 语法格式

protocol的定义

@protocol 协议名称
//方法声明
@end


类遵守协议

一个类可以遵循1个或多个协议

任何类只要遵循了protocol就相当于拥有了protocol的所有的方法声明

@interface 类名:父类<协议1、协议2...>
@end


protocol 和继承区别

继承之后默认就有实现,而protocol只要声明没有实现

相同类型的类可以使用继承,但是不同类型的类只能使用protocol

protocol可以用于存储方法声明,可以将多个类中共有的方法抽取出来,以后让这些类遵守协议即可

protocol注意事项

协议只能声明方法,不能声明属性

#import <Foundation/Foundation.h>

//协议声明
@protocol SportProtocol <NSObject>
//方法声明
-(void)playFootball;
@end
******************************

#import <Foundation/Foundation.h> #import "SportProtocol.h"

// //遵守协议
@interface Student : NSObject<SportProtocol>
@end
******************************

#import "Student.h"

@implementation Student
-(void)playFootball{
NSLog(@"%s",__func__);
}
@end
******************************

#import "Student.h"

@implementation Student
//协议实现
-(void)playFootball{
NSLog(@"%s",__func__);
}
@end


父类遵守了某个类的协议,那么子类也会自动遵守这个协议

#import <Foundation/Foundation.h>

@protocol SportProtocol <NSObject>
-(void)playFootball;
@end
******************************

#import <Foundation/Foundation.h>

#import "SportProtocol.h"

@interface Person : NSObject<SportProtocol>
@end
******************************

#import "Person.h"

@interface Student : Person
@end

#import "Student.h"

@implementation Student
-(void)playFootball{
NSLog(@"%s",__func__);
}
@end


一个类可以遵守多个协议

#import <Foundation/Foundation.h>
@protocol SportProtocol <NSObject>
-(void)playFootball;
@end
***************************
#import <Foundation/Foundation.h>
@protocol StudyProtocol <NSObject>
-(void)studyEnglish;
@end
***************************
#import <Foundation/Foundation.h>
#import "SportProtocol.h"
#import "StudyProtocol.h"
@interface Person : NSObject<SportProtocol,StudyProtocol>
@end
***************************
#import "Person.h"
@implementation Person
-(void)playFootball{
NSLog(@"%s",__func__);
}
-(void)studyEnglish{
NSLog(@"%s",__func__);
}
@end


协议又可以遵守其他协议,只要一个协议遵循了其他协议,那么这个协议就会自动包含其他协议的声明

#import <Foundation/Foundation.h>
@protocol SportProtocol <NSObject>
-(void)playFootball;
@end
***************************
#import <Foundation/Foundation.h>

#improt "SportProtocol.h"

@protocol RunProtocl <SportProtocol>
-(void)run;
@end
***************************
#import "Person.h"
@implementation Person
-(void)playFootball{
NSLog(@"%s",__func__);
}
-(void)run{
NSLog(@"%s",__func__);
}
@end


基协议

NSObject是一个基类,任何其他类都要继承它

还有个名字也叫NSObject的协议,它是一个基协议

NSObject协议中声明最基本的方法

description

retain

release

建议每个新协议都遵循NSObject

#import <Foundation/Foundation.h>

@protocol StudyProtocol <NSObject>
-(void)studyEnglish;
@end


@required 和 @optional关键字

@required:这个方法必须实现,默认就是required(若不实现,编译会报错)

@optional:这个方法不一定要实现

#import <Foundation/Foundation.h>

@protocol StudyProtocol <NSObject>
@required//必须实现
-(void)studyChinese;
@optional//不一定要实现
-(void)studyEnglish;
@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息