本篇为:协议
以下是个人理解中的类目延展协议:
类目:为本类添加新的方法,例如为NSObject类,继承后自雷同样继承父类的类目中的方法
协议:声明了可以被任何类实现的方法(本身不实现,遵守此协议的类娶实现)
延展:为本类添加私有方法,延展的方法只供本类使用
注意:类目和延展都是不可以添加类的实例变量,若必须添加,应该用继承来达到目的(不推荐代码中的添加属性,然后通过重写设置器达到目的)
协议:
1.1是一个方法的列表
1.2声明了可以被任何类实现的方法(里面有你自己声明的各种方法,只要遵循了这个协议,谁都可以在自己的.m文件里实现里面的方法)
1.3格式:在类的后面加上<协议名>,表示此类遵循了这个协议
具体代码如下,细节都写在代码里面了:
2.首先声明一个协议列表(协议)
#import <Foundation/Foundation.h>
//这是一个协议,相当于这里面是一个拥有你放进去很多工具的箱子,下面的方法就是你放进去的工具
@protocol DigProtocol <NSObject>
//这是我放进去的工具
@required//这个关键字:你遵守了我这个协议,就必须实现我这个方法,在你的.m文件里面实现,
-(void)SayHello;
@optional//这个关键字:你遵守了我这个协议,我这个关键字标志的方法实不实现随便你,反正我就有
-(void)random;
@end
创建一个教师类,去遵守这个协议 .h文件
#import <Foundation/Foundation.h>
//我要用这个类去遵守协议,就必须要导入协议的头文件
#import "DigProtocol.h"
@interface Teacher : NSObject<DigProtocol>//后面加上<DigProtocol>就是表示这个类遵守了这个协议
//我遵守了这个类,我就必须去实现这个类里面的 @required 的方法,到自己的.M文件里面去实现
@property(nonatomic,copy)NSString *name;
@end
教师.m文件
#import "Teacher.h"
@implementation Teacher
//再来这里实现协议中 @required 的方法
-(void)SayHello{
NSLog(@"我是%@ 老师,我遵守了学校的规章制度,你好啊",self.name);
}
@end
顺便提及一下代理。创建一个学生类,学生类里面有一个遵循了这个协议的代理属性
#import <Foundation/Foundation.h>
#import "DigProtocol.h"
@interface Student : NSObject
@property(nonatomic,copy)NSString *name;
//为了防止循环引用assign
@property(nonatomic,assign)id<DigProtocol>delegate;
@end
学生类的.m文件
#import "Student.h"
@implementation Student
@end
ViewController文件:
#import "ViewController.h"
#import "Student.h"
#import "Teacher.h"
//#import "DigProtocol.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
Student *stu1 = [Student new];
Teacher *tea1 = [Teacher new];
tea1.name = @"肖老师";
stu1.name = @"小明";
stu1.delegate = tea1;
//判断是否有这个代理,且此代理需要遵守某个协议
if (stu1.delegate && [stu1.delegate conformsToProtocol:@protocol(DigProtocol)]) {
[tea1 SayHello];
}else{
}
以下是运行结果:
2015-12-23 11:38:33.714 OC_协议[1020:53002] 我是肖老师 老师,我遵守了学校的规章制度,你好啊
总结:协议为类提供了访问第三者方法一条通道,试用强大。