iOS中的Protocol

Protocol基本概念

  • 类似于java的接口interface,接口就是一堆方法的声明,没有实现,在OC中接口是由一个叫做协议的Protocol来实现

Protocol 语法格式

  • Protocol的定义
@protocol SportProtocol <NSObject>
- (void)playFootball;
- (void)playBasketball;
- (void)run;
@end
  • 类遵守协议
    • 一个类可以遵循1个或多个协议
    • 任何类只要遵循了Protocol就相当于拥有了Protocol的所有的方法声明
#import <Foundation/Foundation.h>
#import "SportProtocol.h"
@interface Person : NSObject<SportProtocol>

@end

Protocol 和继承区别

  • 继承之后默认就有实现,而protocol只要声明没有实现
  • 相同类型的类可以使用继承,但是不同类型的类只能使用protocol
  • protocol可以用于存储方法声明,可以将多个类中共有的方法抽取出来,以后让这些类遵守协议即可

Protocol 和category区别

  • Category给一个类可以扩充方法,既有申明也有实现,而Protocol只有声明,没有实现
  • Category和Protocol都可以声明方法,不能声明属性

Protocol注意事项

  • Protocol可以用@property形式声明属性,只不过在Protocol中声明的属性,只有对应的setter/getter方法声明,并没有生成对应的成员变量

Protocol:

@protocol SportProtocol <NSObject>
@property (nonatomic,copy) NSString *sportType;
- (void)playFootball;
- (void)playBasketball;
- (void)run;
@end

实现类:

#import <Foundation/Foundation.h>
#import "SportProtocol.h"
@interface Person : NSObject<SportProtocol>
@end

#import "Person.h"
@implementation Person
@synthesize sportType=_sportType;

- (void)readSportType{
   NSLog(@"%@",_sportType);
}
@end

上面方法中主要用到了@synthesize sportType=_sportType, 意思是说,sportType 属性为 _sportType 成员变量合成访问器方法。

 Person *p =[[Person alloc]init];
 p.sportType = @"sport";
 [p readSportType];
  • 父类遵守了某个类的Protocol,那么子类也会自动遵守这个Protocol
#import <Foundation/Foundation.h>
#import "SportProtocol.h"
@interface Person : NSObject<SportProtocol>
@end
----------------------
#import "Person.h"
@interface Student : Person
@end
----------------------
Student *stu = [[Student alloc]init];
[stu playBasketball];
  • 一个类可以遵守多个Protocol
#import <Foundation/Foundation.h>
#import "SportProtocol.h"
#import "StudyProtocol.h"
@interface Person : NSObject<SportProtocol,StudyProtocol>
@end
  • Protocol又可以遵守其他Protocol,只要一个Protocol遵循了其他Protocol,那么这个Protocol就会自动包含其他Protocol的声明
#import <Foundation/Foundation.h>
#import "BaseProtocol.h"
@protocol StudyProtocol <BaseProtocol>
- (void)studyEnglish;
- (void)studyChinese;
@end

基协议

  • NSObject是一个基类,任何其他类都要继承它
  • 还有个名字也叫NSObject的Protocol,它是一个基协议
  • NSObject协议中声明最基本的方法(description、retain、release等等)
  • 每个新协议都遵循NSObject
#import <Foundation/Foundation.h>
@protocol BaseProtocol <NSObject>

@end

Protocol关键字

  • @required:这个方法必须实现,默认就是required(若不实现,编译会报错)
  • @optional:这个方法不一定要实现
@protocol SportProtocol <NSObject>
@required
- (void)playFootball;
- (void)playBasketball;

@optional
- (void)run;
- (void)readSportType;
@end

简单应用

要求:
一个人需要一个app,这个app必须有学习、买东西、分享等功能
处理思路:
1、需要创建一个人和APP
2、需要创建一个Protocol来描述这些功能
3、人拥有的APP要实现这些功能
4、APP需要遵循这个Protocol且实现它

#import <Foundation/Foundation.h>
@protocol DoSomethingProtocol <NSObject>
- (void)buySomething;
- (void)studyEnglish;
- (void)shareInfo;
@end
----------------------------
#import <Foundation/Foundation.h>
#import "DoSomethingProtocol.h"
@class APP;
@interface Person : NSObject
//拥有的APP要实现Protocol的功能
@property (nonatomic,strong) APP<DoSomethingProtocol> *app;
@end
----------------------------
#import <Foundation/Foundation.h>
#import "DoSomethingProtocol.h"
@interface APP : NSObject<DoSomethingProtocol>
@end

#import "APP.h"
@implementation APP
- (void)buySomething {
    NSLog(@"%s",__func__);
}
- (void)shareInfo {
    NSLog(@"%s",__func__);
}
- (void)studyEnglish {
    NSLog(@"%s",__func__);
}
@end
----------------------------
Person *p = [[Person alloc]init];
APP *app = [[APP alloc]init];
//赋值的时候就会判断app是否是符合协议的app,如果app没有遵循协议就会报警告
p.app = app;

//判断app是否有实现协议内容
if([p.app respondsToSelector:@selector(buySomething)]){
        [p.app buySomething];
}
if ([p.app respondsToSelector:@selector(studyEnglish)]) {
        [p.app studyEnglish];
}
if ([p.app respondsToSelector:@selector(shareInfo)]) {
        [p.app shareInfo];
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 30,023评论 8 265
  • 最近工作中遇到一个比较迷惑的事情,在我利用runtime获取类的属性的时候,由于类实现了一个自定义协议,导致遍历出...
    树根曰阅读 4,350评论 2 2
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,902评论 1 32
  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,890评论 0 9
  • 最近工作中遇到一个比较迷惑的事情,在我利用runtime获取类的属性的时候,由于类实现了一个自定义协议,导致遍历出...
    JamesYu阅读 15,958评论 6 28

友情链接更多精彩内容