在阅读一些技术博客等资料时,经常会出现非正式协议与正式协议的字眼,但是对于它的含义不太清楚,这里提出来说明一下。
正式协议
首先我们的正式协议就是指的最常用的那种@protocol的方式来命名的协议方式,主要是配合委托对象来实现代理,就是将多个类共用的方法抽取出来作为一个协议。
使用场景如下:
1.定义一个协议
//GoodStudent.h
#import <Foundation/Foundation.h>
@protocol GoodStudent <NSObject>
//默认是@required
-(void)goodAtEnglish;
@end
2.声明协议
//Student.h
#import <Foundation/Foundation.h>
#import "GoodStudent.h"
//注意实现协议的语法。
@interface Student : NSObject<GoodStudent>
@end
3.实现协议
#import "Student.h"
@implementation Student
-(id)init
{
self = [super init];
if (self) {
//初始化代码
}
return self;
}
-(void)goodAtEnglish
{
NSLog(@"擅长英语。。");
}
@end
非正式协议
非正式协议就是指分类,即凡是NSObject类及其子类的分类,都是非正式协议。相当于一个隐式的协议。
使用场景如下:
//声明
#import <Foundation/Foundation.h>
@interface NSArray (log)
- (NSString *)description;
- (NSString *)descriptionWithLocale:(id)locale;
@end
//实现
#import "NSArray+log.h"
@implementation NSArray (log)
//一般的对象以及自定义对象调用该方法
- (NSString *)description{
NSMutableString *strM = [NSMutableString stringWithString:@"(\n"];
for (NSString *str in self) {
[strM appendFormat:@"\t%@,\n",str];
}
[strM appendString:@")"];
return strM;
return @"aaaa";
}
//NSArray和NSDictionary调用该方法
- (NSString *)descriptionWithLocale:(id)locale{
NSMutableString *strM = [NSMutableString stringWithString:@"(\n"];
for (NSString *str in self) {
[strM appendFormat:@"\t%@,\n",str];
}
[strM appendString:@")"];
return strM;
}
@end