• 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 相类似。

  • 相关阅读:
    C++中的类模板详细讲述
    IE6
    Active Driectory 操作(转来放起来,不要丢了)
    The length of the query string for this request exceeds the configured maxQueryStringLength value
    试一下用word发布一篇文章
    各种分享api
    汇编语言程序设计 检测点1.1
    Windows下配置使用MemCached
    chrome
    ASP.NET 把集合导出为Excel的一个助手类
  • 原文地址:https://www.cnblogs.com/ccguo/p/4151466.html
Copyright © 2020-2023  润新知