Foundation => Objective-C _ Part5
来源:互联网 发布:淘宝网内部优惠券 编辑:程序博客网 时间:2024/05/22 13:06
2016-4-28 第1次修改
2016-4-27 创建
1. 协议
语法格式
@protocl 协议名称方法生命列表@end
- 协议和继承的区别
- 继承之后默认就有实现, 而protocol只是声明没有实现
- 相同类型的类可以使用继承,但不同类型的类只能使用protocol
- protocol可以用于存储方法的声明,可以将多个类中共同的方法抽取出来, 以后让这些类遵守协议即可
- 注意事项
- 协议只能声明方法,不能声明属性
- 父类遵守了某个协议,子类也会自动遵守这个协议
- 在OC中,一个类可以遵守1个或者多个协议
- 注意: OC中的类只能有一个父类, 也就是说OC是单继承
- OC中的协议又可以遵守其他协议, 只要一个协议遵守了其他协议, 那么这个协议中就自动包含了其他协议的声明
- @required, @optional - - - 必选 / 可选
- @required 必须要实现( 默认就是@required ) 如果不实现, 会报警告
- @optional 不一定要实现 , 不实现也不会警告
注意: @required和@optional仅仅适用于程序员之间的交流. 并不能严格控制某一个遵守该协议的类必须要实现该方法,因为即便不实现也不会报错, 只会报警告
协议的应用场景
- 类型限定: 可以将协议写在数据类型的右边, 明确的标注如果想给该变量赋值, 那该对象必须遵守某个协议
- 注意: 类型限定是写在数据类型的右边的
- 虽然在接受某一个对象的时候, 对这个对象进行了类型限定(限定它必须实现某个协议), 但并不意味这个对象真正实现了该方法. 所以每次在调用对象的协议方法时应该进行一次判断
if([self.wife respondsToSelector:@selector(cooking)]) { //业务逻辑 }
- 代理设计模式
- 设计模式: 是一套被反复使用, 多数人知道, 经过分类边目的, 代码设计经验的总结.
@property (nonatomic, weak) id<BabyPotocol>nany;
应用场景
当A对象想监听B对象的一些变化时, 可以使用代理设计模式.
- 例如:保姆想监听婴儿变化, 那么保姆就可以成为婴儿的代理. 之后婴儿的变化保姆都能知道
当B对象发生一些事情, 想通知A对象的时候, 可以使用代理设计模式
- 婴儿想通知保姆, 就可以让保姆成为婴儿的代理,以后婴儿发生变化就可以通知保姆
- 当对象A无法处理某些行为的时候, 想让对象B帮忙处理(让对象B成为对象A的代理对象)
- 婴儿不能自己吃东西, 也不能自己睡, 所以需要保姆帮忙, 只要保姆陈伟婴儿代理, 就可以帮婴儿吃睡
- 类型限定: 可以将协议写在数据类型的右边, 明确的标注如果想给该变量赋值, 那该对象必须遵守某个协议
- 协议的编写规范
- 一般情况下, 当前协议属于谁, 我们就将协议定义到谁的头文件
- 协议的名称一般以它属于的那个类的类名开头, 后面跟上protocol或者delegate
- 协议中的方法名称一般以协议的名称protocol之前的作为开头
- 一般情况下协议中的方法会将发出该协议的对象传递进去
- 一般情况下一个类中的代理属性的名称, 叫做delegate
- 当某一个类要成为另外一个类的代理的时候, 一般情况下,
- 在.h中,用@protocol 协议名称; 告诉当前类,这是一个协议.
- 在.m中,用#import真正的导入一个协议的声明
- 框架 - - - 众多API的结合
2. 代理设计模式
delegate实现步骤
- 设定代理对象 - - - 例如: 成为(子)控件的代理,父亲(控制器)成为儿子(文本框)的代理
- 遵守代理协议
- 代理方法实现 == 写在视图控制器里. 但是需要由委托方的delegate来调用实现
- 发生事件时,自定义控件的delegate属性, 调用代理方法
使用场合
- 对象A内部发生了一些事情, 想通知对象B
- 对象B想监听对象A内部发生了什么事情
- 对象A想在自己的方法内部调用对象B的某个方法, 并且对象A不能对对象B有耦合依赖
- 对象A想传递数据给对象B
- 以上情况, 让对象B是对象A的代理, 都能实现
- 例如:
- controller => footer view去工作:直接调用footer view的方法即可
- 个人理解
- 是父控件(视图控制器)监听子控件的事件, 当子控件发生某些事情时, 通知父控件工作
- 监听那些不能通过addTarget监听的事件
- 主要用来负责在两个对象之间,发生某些事件时,来传递消息或者数据
3. 通知
- 也是用于”监听”, 主要是补充: 父控件的代理方法不够用的时候, 使用通知
流程: 创建通知中心, 订阅通知, 发布通知, 退订通知
- 创建通知中心 NSNotificationCenter => 控制器方法. => NSNotification *center = [NSNotificationCenter defaultCenter];
订阅通知 => 控制器方法 =>
center addObsever: 订阅通知的对象 selector:@select(订阅通知对象用哪个方法接收通知) name:@“通知名称” object:发布者
发通知 => 控制器方法 =>
[center postNotificationName:@“通知名称” object: 发布者 userInfo: 通知的内容 @{@“数量”:@2 ,@“介绍”,@“毒牛奶在三鹿”} 字典类型
- 接收通知 => 接收者自己实现的方法.写在接收者类里=>写一个接收通知的方法, 需要带NSNotification的参数 =>
- (void) shouniunai:(NSNotification *)noti {};
- 退订通知 => 接收者进行退订, 写在接收者的类里 =>
- (void)dealloc { [NSNotificationCenter defaultCenter] removeObsever: self};
- 和代理的关系
- 都是监听用途. 是一个对象, 告诉另一个对象做事情
- 区别:
- 代理: 要有代理协议 ,是1vs1的关系
- 通知: 是 多vs多的关系
0 0
- Foundation => Objective-C _ Part5
- Foundation => Objective-C _ Part1
- Foundation => Objective-C _ Part2
- Foundation => Objective-C _ Part3
- Foundation => Objective-C _ Part4
- Foundation => Objective-C _ Part6
- Foundation => Objective-C - Const
- Foundation => Objective-C - NSString
- Foundation => Objective-C - NSDate & NSCalendar
- Foundation => Objective-C - NSArray & NSMutableArray
- Objective-C Foundation基础
- Objective-C---Foundation框架
- objective-c之Foundation
- Objective-C:Foundation
- Objective-C:Foundation
- Objective-C:Foundation
- Objective-C Foundation框架
- Objective-C Foundation
- 浅谈Hive vs. HBase
- PHP数组
- adb shell查看sqlite数据库
- leetcode 83. Remove Duplicates from Sorted List
- 第9周-项目1-深复制体验(1)
- Foundation => Objective-C _ Part5
- PHP字符串
- 第八周项目32-对程序运行结果的理解
- 24-Longest Palindromic Substring-Leetcode
- andoid studio 运行项目 finished with non-zero exit value 1 错误
- AAC音频裸码流时间戳与时间长度的关系
- <OJ_Sicily>1438Shopaholic
- Shader之学习笔记二
- 赶集网mysql开发36军规