iOS开发–Objective-C的多继承

那是自我个人的读书笔记 , 如有不一致意见欢迎评论沟通 .

( GeekBand-极客班
http://geekband.com
)
( 我的新浪 :
http://weibo.com/JohnnyB0Y
)

小结 iOS 平时开支中的三种常用传值方式:

  1. 正向传值
  2. 代理传值
  3. block传值
  4. 公告传值
  5. 单例

Objective-C本身不支持多继承 , 不过方法总是有些 .

  • ##### 通过整合已毕多一连

一旦C类要同时继续A类和B类 .
1.C类在头文件导入A类和B类的头文件 .
2.C类头文本宣称要求持续自A类和B类已部分艺术和性能 . ( 完毕持续的特征 )
3.在C类内部成立A类和B类的实例 , 变成温馨的积极分子变量 . ( C类调用方法时 ,
方法内部是用A类和B类调用自己相应的艺术 )
4.把A类和B类的性质与C类的性质存储方法关联起来 . ( C类继承自A类和B类 ,
就所有了A类和B类的力量 , 可是我们是在通过结合来落实多继承 ,
所以一定要力保属性关联正确 )
5.C类调用继承过来的不二法门时 , 实际内部是用A类和B类调用自己相应的方法的 .

  • ##### 通过协议落到实处多接二连三

比方C类要同时继续A类和B类 .
1.C类在头文件导入A类和B类的头文件 .
2.在A类和B类把须要被C类继承的方式和总体性申明成一份协议 .
3.C类听从A类和B类的说道 .
4.在促成公文中贯彻协议方法 , 协议属性也要完毕 . (
问题是您无法调用到A类和B类原生的措施 )

  • ##### 组合和啄磨落到实处多一连的题材

1.组合完毕下 , 想要继承来的甭管是性质照旧艺术都尚未提示 .
2.即使后续来的多少个类中属性名和艺术名相同就很麻烦了 , 要仔细区分开 .
3.因而商事落到实处的多继承 , 不可能调用父类的格局 .

  • ##### 尝试解决问题

通过把三种完成格局结合起来用 , 感觉好了成千成万 .
不过问题2 的性能和艺术名争执仍旧需求团结解决 .

  • #### 总结
实际个人觉得 , 多继承和三番三回都能用组合方式来顶替 , 而且组合方式更解耦不是吗 ?!

作品代码:https://github.com/mortal-master/BWTransferValueDemo


1. 正向传值

  • 利用情况:界面 A 跳转界面 B 的还要,向界面 B
    传递值,即上级向下属传递
  • 步骤:

    1. 在界面 B 的 .h 文件中公开声称一个性能

      @interface ViewC1 : UIViewController
      
      //正向传值 1
      @property (nonatomic, copy) NSString *value_1;
      
      @end
      
    2. 导入界面 B 的头文件,并应用 B 创制出一个对象,对性能举办赋值

      ViewC1 *VC1 = [[ViewC1 alloc] init];
      VC1.value_1 = @"我是正向传值";
      [self.navigationController pushViewController:VC1 animated:YES];
      

2. 代理传值

  • 动用情况:界面 A 跳转界面 B ,界面 B 再次回到界面 A 时传结果给
    A,即下级向上司传递
  • 步骤:

    1. 在界面 B 头文件中定义协议

      @protocol ViewC2Delegate <NSObject>
      
      - (void)changeMainVCBackgroundColor:(UIColor *)color;
      @end
      
    2. 在界面 B 头文件中定义代理属性

      @interface ViewC2 : UIViewController
      
      @property (nonatomic, weak) id<ViewC2Delegate> delegate;
      @end
      
    3. 在界面 B 的 .m 中适量岗位调用代理方法

      // 3.调用代理方法 <需先进行检测>
      if ([self.delegate respondsToSelector:@selector(changeMainVCBackgroundColor:)]) {
          [self.delegate changeMainVCBackgroundColor:[UIColor greenColor]];
      }
      
    4. 在界面 A 中装置代理

    5. 在界面 A 中遵从协议

      @interface ViewController ()<ViewC2Delegate>
      @end
      
      ViewC2 *VC2 = [[ViewC2 alloc] init];
      VC2.delegate = self;
      [self.navigationController pushViewController:VC2 animated:YES];
      
    6. 兑现代理协议中的方法

      - (void)changeMainVCBackgroundColor:(UIColor *)color {
      
          self.view.backgroundColor = color;
      }
      

3. block传值

  • 使用情状:类似代理,当协议中的方法唯有一个,可以应用
    block,此时得以不用写协议,相当于简化的代办
  • 步骤:

    1. 在发送者头文件中定义 block 属性

      @interface ViewC3 : UIViewController
      
      @property (nonatomic, copy) void (^changeMainVCBgColor)(UIColor *color);
      
      @end
      
    2. 在发送者 .m 文件合适岗位调用 block

      //调用block
      if (self.changeMainVCBgColor) {
          self.changeMainVCBgColor([UIColor redColor]);
      }
      
    3. 在接收者中贯彻具体操作

      ViewC3 *VC3 = [[ViewC3 alloc] init];
      VC3.changeMainVCBgColor = ^(UIColor *color) {
          self.view.backgroundColor = color;
      };
      [self.navigationController pushViewController:VC3 animated:YES];
      

4. 通报传值

  • 选择景况:代理一般适用于上下级之间,假设多级结构时会十分劳累,使用文告没有级别结构限制
  • 步骤:

    1. 在发送者中宣布布告

      //1.发布通知
      NSDictionary *dict = @{@"color":[UIColor grayColor]};
      [[NSNotificationCenter defaultCenter] postNotificationName:@"ChangeMainBgColor" object:@"VC42" userInfo:dict];
      
    2. 在接收者中注册通告

      //2.一般在 viewDidLoad 中注册通知
      //通知名称需一致
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeColor:) name:@"viewDidLoad" object:@"VC42"];
      
    3. 在接收者中落成公告具体操作

      - (void)changeColor:(NSNotification *)noti {
      
          NSDictionary *dict = noti.userInfo;
          self.view.backgroundColor = [dict valueForKeyPath:@"color"];
      }
      
    4. 在接收者中收回通知

      - (void)dealloc {
      
          [[NSNotificationCenter defaultCenter] removeObserver:self name:@"ChangeMainBgColor" object:@"VC42"];
      }
      

5. 单例传值

  • 使用景况:多次创设仅有唯一一个,随用随取
  • 步骤:

    1. 开创单例类,注明须求传递的习性

      @interface Person : NSObject
      
      interfaceSingleton(PersonName);
      
      @property (nonatomic, copy) NSString *name;
      
      @end
      
    2. 实例化一个目的,对目的的性能举办赋值

      Person *person = [[Person alloc] init];
      person.name = @"单例赋值的名字";
      
    3. 在急需动用的地点实例化一个对象,取出属性值

      Person *person = [[Person alloc] init];
      NSLog(@"取出单例赋值:%@", person.name);
      

      PS: 创立单例类请查看自己后边的篇章《iOS
      单例形式简析》


个体博客:https://mortal-master.github.io