Objective - C 之协议
一、创建方法:



二、实现过程:
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 之协议的更多相关文章
- Objective中的协议(Protocol)
Objective中的协议(Protocol) 作用: 专门用来声明一大堆方法. (不能声明属性,也不能实现方法,只能用来写方法的声明). 只要某个类遵守了这个协议.就相当于拥有这个协议中的所有的方法 ...
- Objective-C中的类目,延展,协议
Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上.在其他OOP语言中就没见过这些名词,刚看到这三个名词 ...
- Xcode 常用编译选项设置
Xcode 常用编译选项设置 在xcconfig文件中指定即可. 用标准库连接 LINK_WITH_STANDARD_LIBRARIES = YES如果激活此设置,那么编译器在链接过程中会自动使用通过 ...
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- Objective-C( Category 分类,非正式协议,分类延展)
分类: 主要是给原来类增加一些方法;不可以增加成员变量 Person (Person+eat) 非正式协议: 非正式协议就是类别,即凡是NSObject或其子类Foundation框架中的类增加的类别 ...
- Objective-C( protocol协议)
protocol 协议 protocol:用来声明方法 1.协议的定义 @protocol 协议名称 <NSObject> // 方法声明列表.... @end 2.如何遵守协议 1> ...
- 【IOS 开发】Objective - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射
一. Objective-C 对象简单处理 1. 包装类 (1) 包装类简介 NSValue 和 NSNumber : -- 通用包装类 NSValue : NSValue 包装单个 short, i ...
- 刨根问底Objective-C Runtime
http://chun.tips/blog/2014/11/05/bao-gen-wen-di-objective%5Bnil%5Dc-runtime-(2)%5Bnil%5D-object-and- ...
- Objective-C( Foundation框架 一 字符串)
Objective-C 中核心处理字符串的类是 NSString 与 NSMutableString ,这两个类最大的区别就是NSString 创建赋值以后该字符串的内容与长度不能在动态的更改,除非重 ...
随机推荐
- Altium Designer (AD) 中规则的部分讲解
当创建好PCB时,选择 Design - Rules 即可进行规则的设置,也可以直接利用快捷键D-R(多利用快捷键,可以有效的提高设计效率,) 这个是规则的总界面,熟练以后可以直接从这里进行修改,很便 ...
- sougoupinyin for linux 安装步骤(精简版)
download deb double-click to install select fcitx reboot click it in the bar and choose the"tex ...
- day2 CSS- 选择器
1.CSS 语法 css是英文Cascading Style Sheets的缩写,称为层叠样式表 2.css的四种引入方式 1.行内式 行内式是在标记的style属性中设定CSS样式.这种方式没有体现 ...
- CF 547 D. Mike and Fish
D. Mike and Fish http://codeforces.com/contest/547/problem/D 题意: 给定平面上n个点,将这些点染成红或者蓝色,要求每行.每列红色点与蓝色点 ...
- 使用Python的BeautifulSoup 类库采集网页内容
BeautifulSoup 一个分析.处理DOM树的类库.可以做网络爬虫.模块简称bs4. 安装类库 easy_install beautifulsoup4 pip install beautiful ...
- L012-linux系统文件属性知识深入详解小结
L012-linux系统文件属性知识深入详解小结 最近的学习重点不在这上面,所以更新的比较慢,再加上母亲住院,感情问题,一系列吧,愿快点度过这黑色的4月份,希望我能在5月份阳光起来,加油! 回归正题 ...
- Maven学习(三)-----Maven本地资源库
Maven本地资源库 Maven的本地资源库是用来存储所有项目的依赖关系(插件jar和其他文件,这些文件被Maven下载)到本地文件夹.很简单,当你建立一个Maven项目,所有相关文件将被存储在你的M ...
- Codeforces Round #502 (in memory of Leopoldo Taravilse, Div. 1 + Div. 2) E. The Supersonic Rocket
这道题比赛之后被重新加了几个case,很多人现在都过不了了 算法就是先求凸包,然后判断两个凸包相等 我们可以吧凸包序列化为两点距离和角度 角度如果直接拿向量的叉积是不对的,,因为钝角和锐角的叉积有可能 ...
- Saving James Bond - Easy Version (MOOC)
06-图2 Saving James Bond - Easy Version (25 分) This time let us consider the situation in the movie & ...
- JavaScript事件冒泡和捕获
事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件. 事件冒泡是自下而上的去触发事件. 绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获.true,事件捕获:fa ...