非正式协议与正式协议

2017-09-25  本文已影响76人  Magic_小杜

在阅读一些技术博客等资料时,经常会出现非正式协议与正式协议的字眼,但是对于它的含义不太清楚,这里提出来说明一下。

正式协议

首先我们的正式协议就是指的最常用的那种@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
上一篇 下一篇

猜你喜欢

热点阅读