zoukankan      html  css  js  c++  java
  • Objective-C 中的方法回掉

    Objective-C 中的方法回掉 

    Objective-C 中的方法调用

     

    OC 类似C+,避免不了的内部的各种通信手段,函数调用,变量传递等,避免不了各种回掉等。

    一、class直接调用 或者 obj调用

    OC内方法主要分为两种,一种  “-” 开头的实例方法,这种方法顾名思义,一定要有具体的实例对象才能去掉用。

    如: [obj methodName];

    另一种是以 “+” 开头的静态方法,这类方法一般不通过创建对象就能调用,直接通过 [ClassName StaticMethodName],就可以实现方法的调用。

    如: [ClassName StaticMethodName];

     

    二、代理设计模式

    单从设计模式上来说,可能觉得代理是个很复杂的东西,其实无非是让某个OBJ 保留一个可以使用的指针,在关键时刻把某部分任务交付于指针所保留指向的那个对象去完成,这种手段比较常见(可以做数据传递,也可以做方法回掉(在两个class中去调用对方的方法)。

    C+ 中除了保留一个指针以外,在使用的时间,指针指向某个对象的地址,可以通过这个指针获取到对应的对象去做对应的任务,C+的特性是方法调用的时间必须要清楚该对象所属的具体的Class 的类别,否则系统会报错说找不到某个对应的method,直接导致编译错误,这些都跟他的特性有关。所以会存在某些对应的强弱类型转化。 如果由子类型对象向父类是安全的,反过来则是非常危险的了。

    iOS里面的代理主要是一个公用的协议、协议对应的class、以及要实现协议的class三部分组成。iOS 的delegate同C++ 有类似,但也有区别。delegate的声明一般是id类型 的,id 类型类似与C++ 里面的  (void *),可以指向任意对象。首先代理类要想在某个时刻调用别人的方法,代理类必须定义一个对应协议, 之后代理类就可以按照自己的协议模板来走, 最终协议的实现由其他类来完成。最终结果是代理类没有实现该方法,但是可以调到该方法,实现协议的类实现了对应的方法但是一般不直接调用该方法。代理类和实现代理类在发生调用的时间,由中间的一个指针来联通着上下起到一个控制链的作用。

    备注: 在代理类中调用协议中的方法的时间尽量按照objective—C的规则来走,避免不必要警告问题,定义好对应的协议,在代理类中按照这个规则来走,

     

    如:

    @protocol  JDFooterLoadingViewDelegate;

    @interface JDFooterLoadingView : UIView {

    }

    A1.  @property (nonatomic,assign)id<JDFooterLoadingViewDelegate> delegate;      

    // 可以使用泛型

    @end

     

    @protocol JDFooterLoadingViewDelegate <NSObject>

    @optional

    - (void)footerLoadingViewBackAction:(id)sender;

    @end

    调用时间:

    A2 . if ([self.delegate respondsToSelector:@selector(footerLoadingViewBackAction:)]) {

            [self.delegate footerLoadingViewBackAction:sender];

        }此处如果没有声明定义protocol,在做方法真别判断时间就会显示警告,虽然OC运行时间才会决定具体的类型,不会导致crash,但是编译时间会产生警告。建议按照规则来。

     

    JDFooterLoadingViewDelegate协议由初始化使用JDFooterLoadingView的那个类去完成

     

    后注:

    项目中有部分class,只保留一个delegate的指针,之后A2处发生警告,为消除警告,此地方只能用指针强转去避免。(将self.delegate 强制转换成实现协议的class类型)

     

    二、闭包( block)

    ViewControllerA -> ViewControllerB,  ViewControllerB执行完成后需要立即调用ViewControllerA中的操作,这个时间除了代理外使用闭包也是很好的选择,在ViewControllerB中定义一个block,

     

    在ViewControllerA 中跳转时间

    ViewControllerA.m

    ViewControllerB *vcb =[ [ViewControllerA alloc] init];

    vcb.complateBlock = ^{

    //do something;

    };

    闭包的实现在ViewControllerA中,真正调用在ViewControllerB中,这种手段也可以解决问题。

     

    闭包与代理优缺点,闭包思路更加清晰,不用定义协议实现方法等烦琐操作,但是闭包本身也是一种对象,再次增加对象生命周期的管理,还要避免重复引用等。

     

    三、 通知模式

    NSNiotificationCenter  ,上述问题在ViewControllerB抛出通知,ViewControllerA增加监听, 缺点(逻辑断点)。

    KVO,与NSNiotificationCenter 相类似。

  • 相关阅读:
    POJ1486 Sorting Slides 二分图or贪心
    POJ2060 Taxi Cab Scheme 最小路径覆盖
    POJ3083 Children of the Candy Corn 解题报告
    以前的文章
    POJ2449 Remmarguts' Date K短路经典题
    这一年的acm路
    POJ3014 Asteroids 最小点覆盖
    POJ2594 Treasure Exploration 最小路径覆盖
    POJ3009 Curling 2.0 解题报告
    POJ2226 Muddy Fields 最小点集覆盖
  • 原文地址:https://www.cnblogs.com/ccguo/p/4151466.html
Copyright © 2011-2022 走看看