Foundation => Objective-C _ Part5

来源:互联网 发布:淘宝网内部优惠券 编辑:程序博客网 时间:2024/05/22 13:06

2016-4-28 第1次修改
2016-4-27 创建


1. 协议

  1. 语法格式

    @protocl 协议名称方法生命列表@end
  2. 协议和继承的区别
    • 继承之后默认就有实现, 而protocol只是声明没有实现
    • 相同类型的类可以使用继承,但不同类型的类只能使用protocol
    • protocol可以用于存储方法的声明,可以将多个类中共同的方法抽取出来, 以后让这些类遵守协议即可
  3. 注意事项
    • 协议只能声明方法,不能声明属性
    • 父类遵守了某个协议,子类也会自动遵守这个协议
    • 在OC中,一个类可以遵守1个或者多个协议
      • 注意: OC中的类只能有一个父类, 也就是说OC是单继承
    • OC中的协议又可以遵守其他协议, 只要一个协议遵守了其他协议, 那么这个协议中就自动包含了其他协议的声明
  4. @required, @optional - - - 必选 / 可选
    • @required 必须要实现( 默认就是@required ) 如果不实现, 会报警告
    • @optional 不一定要实现 , 不实现也不会警告
      注意: @required和@optional仅仅适用于程序员之间的交流. 并不能严格控制某一个遵守该协议的类必须要实现该方法,因为即便不实现也不会报错, 只会报警告
  5. 协议的应用场景

    • 类型限定: 可以将协议写在数据类型的右边, 明确的标注如果想给该变量赋值, 那该对象必须遵守某个协议
      • 注意: 类型限定是写在数据类型的右边的
      • 虽然在接受某一个对象的时候, 对这个对象进行了类型限定(限定它必须实现某个协议), 但并不意味这个对象真正实现了该方法. 所以每次在调用对象的协议方法时应该进行一次判断
        if([self.wife respondsToSelector:@selector(cooking)]) { //业务逻辑 }
    • 代理设计模式
      • 设计模式: 是一套被反复使用, 多数人知道, 经过分类边目的, 代码设计经验的总结.
        @property (nonatomic, weak) id<BabyPotocol>nany;
    • 应用场景

      • 当A对象想监听B对象的一些变化时, 可以使用代理设计模式.

        • 例如:保姆想监听婴儿变化, 那么保姆就可以成为婴儿的代理. 之后婴儿的变化保姆都能知道
      • 当B对象发生一些事情, 想通知A对象的时候, 可以使用代理设计模式

        • 婴儿想通知保姆, 就可以让保姆成为婴儿的代理,以后婴儿发生变化就可以通知保姆
      • 当对象A无法处理某些行为的时候, 想让对象B帮忙处理(让对象B成为对象A的代理对象)
        • 婴儿不能自己吃东西, 也不能自己睡, 所以需要保姆帮忙, 只要保姆陈伟婴儿代理, 就可以帮婴儿吃睡
  6. 协议的编写规范
    • 一般情况下, 当前协议属于谁, 我们就将协议定义到谁的头文件
    • 协议的名称一般以它属于的那个类的类名开头, 后面跟上protocol或者delegate
    • 协议中的方法名称一般以协议的名称protocol之前的作为开头
    • 一般情况下协议中的方法会将发出该协议的对象传递进去
    • 一般情况下一个类中的代理属性的名称, 叫做delegate
    • 当某一个类要成为另外一个类的代理的时候, 一般情况下,
      • 在.h中,用@protocol 协议名称; 告诉当前类,这是一个协议.
      • 在.m中,用#import真正的导入一个协议的声明
  7. 框架 - - - 众多API的结合

2. 代理设计模式

  1. delegate实现步骤

    • 设定代理对象 - - - 例如: 成为(子)控件的代理,父亲(控制器)成为儿子(文本框)的代理
    • 遵守代理协议
    • 代理方法实现 == 写在视图控制器里. 但是需要由委托方的delegate来调用实现
    • 发生事件时,自定义控件的delegate属性, 调用代理方法
  2. 使用场合

    • 对象A内部发生了一些事情, 想通知对象B
    • 对象B想监听对象A内部发生了什么事情
    • 对象A想在自己的方法内部调用对象B的某个方法, 并且对象A不能对对象B有耦合依赖
    • 对象A想传递数据给对象B
    • 以上情况, 让对象B是对象A的代理, 都能实现
  3. 例如:
    • controller => footer view去工作:直接调用footer view的方法即可
  4. 个人理解
    • 是父控件(视图控制器)监听子控件的事件, 当子控件发生某些事情时, 通知父控件工作
    • 监听那些不能通过addTarget监听的事件
    • 主要用来负责在两个对象之间,发生某些事件时,来传递消息或者数据

3. 通知

  1. 也是用于”监听”, 主要是补充: 父控件的代理方法不够用的时候, 使用通知
  2. 流程: 创建通知中心, 订阅通知, 发布通知, 退订通知

    • 创建通知中心 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};
  3. 和代理的关系
    • 都是监听用途. 是一个对象, 告诉另一个对象做事情
    • 区别:
      • 代理: 要有代理协议 ,是1vs1的关系
      • 通知: 是 多vs多的关系
0 0
原创粉丝点击