一、创建方法:

二、实现过程:

1、遵循协议:

@protocol NurseWorkingProtocol <NSObject>   //<> 表示遵守协议,创建时就有(NurseWorkingProtocol.h中)

2、协议内容:(NurseWorkingProtocol.h中)

@required  // 必须做的,默认

- (void)cleanHouse;

@optional  // 可选的

- (void)cook;

3、指定遵循协议的人:(Nurse.h中)

@interface Nurse : NSObject <NurseWorkingProtocol>   // 遵守协议

4、完成协议指定的内容:(Nurse.m中实现)

- (void)cleanHouse {

NSLog(@"打扫房间!");

}

- (void)cook {

NSLog(@"做饭");

}

三、代理委托:(用Custom找Business买iPhone举例)

1、创建协议:(Custom.h中)

@protocol CustomDelegate <NSObject>

- (void)buyIphone:(NSString *)iphoneType;

@end

2、设置代理人:

@property (nonatomic,weak) id<CustomDelegate> delegate;  // 必须遵守协议

3. 找代理人,见Business.h中遵守协议,并在Business.m中实现协议中的方法

@interface Business : NSObject <CustomDelegate>
- (void)buyIphone:(NSString *)iphoneType {

    NSLog(@"%@有货,我帮你买手机", iphoneType);
}

4、上述一切准备就绪,就可以开始买手机啦:(Custom.h中声明方法,在Custom.m中实现如下)

 
- (void)beginBuy {

    //   找到代理人                代理人实现了代理方法,响应方法
if (self.delegate && [self.delegate respondsToSelector:@selector(buyIphone:)]) {
[self.delegate buyIphone:@"iphone7"]; }else {
NSLog(@"代理人不存在或者代理人没有实现代理方法");
}
}

5、在main函数中分别定义一个Custom和Business对象,将Custom对象的代理给business,即找到代理人,然后开始:

custom.delegate = business;  // 找到代理人

[custom beginBuy];           // 开始买

四、通知

1、发布通知:(main.m)

 // 1. custom 发布通知              通知的关键标志 name 用于标识后面接收该通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"buyIphone" object:@"iphone7"];

2、添加观察:(Business.m)

- (instancetype)init {

    self = [super init];

    if (self) {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(notification:) name:@"buyIphone" object:nil];
}
return self;
}
- (void)notification :(id)noti {
id obj = [noti valueForKey:@"object"]; // ValueForkey 因为是kvc的
NSLog(@"noti = %@", noti);
NSLog(@"object = %@", obj);
} - (void)dealloc { // [[NSNotificationCenter defaultCenter]removeObserver:self]; // 移除所有通知 [[NSNotificationCenter defaultCenter]removeObserver:self name:@"buyIphone" object:nil]; // 移除单条通知 因为是在ARC状态下,所以没有[super dealloc]
}

五、总结:

1. 协议只有声明文件

2. 在遵守协议的类中导入协议的文件,并添加遵守协议  在@interface 后面加尖括号遵守协议

3. @required 必须在.m 中实现, @option 可以不用实现,也即遵守协议做事情

4. 原本类(Nurse.h)中 写@interface Nurse : NSObject <NurseWorkingProtocol>

委托代理

5. 可以单独写一个文件,如上所述,还可以在类中直接写 @protocal 见“代理委托”

6. 对象类型后面加了<协议名>, 则该对象一定得是遵守了这个协议的对象

7. 设置代理人的时候,要用弱引用(weak),而且要遵守过协议的对象才能成为代理人

8. 委托代理使用了回调机制

通知

1. 注册接收通知的观察着

2. 发送通知(postNotification)   ---   接收通知(addObserve)

3. 移除通知 (dealloc 中 remove)

Objective - C 之协议的更多相关文章

  1. Objective中的协议(Protocol)

    Objective中的协议(Protocol) 作用: 专门用来声明一大堆方法. (不能声明属性,也不能实现方法,只能用来写方法的声明). 只要某个类遵守了这个协议.就相当于拥有这个协议中的所有的方法 ...

  2. Objective-C中的类目,延展,协议

    Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上.在其他OOP语言中就没见过这些名词,刚看到这三个名词 ...

  3. Xcode 常用编译选项设置

    Xcode 常用编译选项设置 在xcconfig文件中指定即可. 用标准库连接 LINK_WITH_STANDARD_LIBRARIES = YES如果激活此设置,那么编译器在链接过程中会自动使用通过 ...

  4. Automake

    Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...

  5. Objective-C( Category 分类,非正式协议,分类延展)

    分类: 主要是给原来类增加一些方法;不可以增加成员变量 Person (Person+eat) 非正式协议: 非正式协议就是类别,即凡是NSObject或其子类Foundation框架中的类增加的类别 ...

  6. Objective-C( protocol协议)

    protocol 协议 protocol:用来声明方法 1.协议的定义 @protocol 协议名称 <NSObject> // 方法声明列表.... @end 2.如何遵守协议 1> ...

  7. 【IOS 开发】Objective - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射

    一. Objective-C 对象简单处理 1. 包装类 (1) 包装类简介 NSValue 和 NSNumber : -- 通用包装类 NSValue : NSValue 包装单个 short, i ...

  8. 刨根问底Objective-C Runtime

    http://chun.tips/blog/2014/11/05/bao-gen-wen-di-objective%5Bnil%5Dc-runtime-(2)%5Bnil%5D-object-and- ...

  9. Objective-C( Foundation框架 一 字符串)

    Objective-C 中核心处理字符串的类是 NSString 与 NSMutableString ,这两个类最大的区别就是NSString 创建赋值以后该字符串的内容与长度不能在动态的更改,除非重 ...

随机推荐

  1. 第一篇 C/C++基本语言类型

    总概: { C:面向过程,以过程为中心,以算法为驱动 } { C++:面向对象,以过对象中心,以消息为驱动 个人理解:一切皆对象的思想 } 一 前言总概 1.常量变量 初始化对象与赋值是两个概念 直接 ...

  2. C++ —— 类中static和const关键字声明变量的初始化方式总结

    在类中声明变量/常量时,经常会用到static.const关键字.对于该变/常量的初始化问题,网上有许多相关文章,但是大多不够完善,或者存在错误.经过实际验证,总结如下: (注明:测试编译平台为VS2 ...

  3. 重学Veriliog(2)——高级编程语句

    1.判断 1.1 if ... else ... 有优先级 在组合逻辑电路中,需要避免产生Latch(避免结构不完整) Latch容易引起竞争冒险,同时静态时序分析工具也不好分析穿过Latch的路径? ...

  4. 20155217 《Java程序设计》第三次实验报告

    20155217 <Java程序设计>第三次实验报告 实验内容 XP基础 XP核心实践 相关工具 实验要求 没有Linux基础的同学建议先学习<Linux基础入门(新版)>&l ...

  5. 20155318 2016-2017-2《Java程序设计》课程总结

    20155318 2016-2017-2<Java程序设计>课程总结 每周作业链接 预备作业1:亦师亦友--我所期望的师生关系,对专业的认识与期望等 预备作业2:没有了自主,学习的小船说翻 ...

  6. HDU 6086 Rikka with String

    Rikka with String http://acm.hdu.edu.cn/showproblem.php?pid=6086 题意: 求一个长度为2L的,包含所给定的n的串,并且满足非对称. 分析 ...

  7. flume 安装过程记录

    1.安装jdk 2.下载安装包 : apache-flume-1.7.0-bin.tar.gz 安装包是在win下载的,需要拖动到ubuntu下的/home/hadoop (拖动不了需要先安装  lr ...

  8. Linux中如何安装Apache服务器

    Linux中如何安装Apache服务器 由于学习的需要,所有手动安装了一下Apache源码包,安装过程中的问题千奇百怪,但是如果弄清楚了问题出在哪里,那么也不是太难.如果有学习者出现安装中的问题,可仔 ...

  9. Vue学习计划基础笔记(三)-class与style绑定,条件渲染和列表渲染

    Class与style绑定.条件渲染和列表渲染 目标: 熟练使用class与style绑定的多种方式 熟悉v-if与v-for的用法,以及v-if和v-for一起使用的注意事项 class与style ...

  10. JavaScript指定断点操作

    什么是断点操作(Breakpoint action) 做前端开发的小伙伴,或许对这个断点操作不是很熟悉.不过你要是问其他语言(比如C,C++ ,C #等)的开发者,他们应该都挺熟悉断点操作,这种断点操 ...