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

Objective-C 中的方法回掉的更多相关文章

  1. layer插件open方法回掉值问题

    最近做项目需用到一个弹出层加载iframe页面的东西,首先想到layer插件,此插件用到过多次,兼容性很好,功能也强大,废话不多说上代码. 其实功能很简单,就是在目标页面选择一个值,回掉回来,说明一下 ...

  2. redis-java中的callback回掉机制

    springboot整合redis后, 会提供StringRedisTEmplate和 RedisTemplate 两个模板类供食用, 有时候这并不能满足我们的需求, 需要使用 connect 处理, ...

  3. Android PopupWindow 消失后的回掉方法

    popupwindow 会在点击屏幕其他地方消失,但是这个消失时的回掉方法一直没有找到,困扰了一个多月,差了不少百度,没有很好解决,今天偶然看到了setOnDismissListener这个方法!没想 ...

  4. 使用Memcache在PHP中调试方法的介绍及应用

    使用Memcache在PHP中调试方法的介绍及应用 如果我们在网络开发中,特别是大访问量的web项目开发中,为了提高响应速度,减少数据查询运算,那么我们都会选用memcahce.首先我们必须要安装,接 ...

  5. JS-特效 ~ 05. 缓动框架兼容封装/回掉函数/兼容透明度/层级、旋转轮播图、正则表达式、验证表单注册账号、

    缓动函数中opcity  写百分值的值 JS一般不用小数运算,会照成精度丢失 元素的默*认透明度是 层级一次性赋值,不缓动 利用for…in为同一个父元素的子元素绑定属性 缓动框架兼容封装/回掉函数/ ...

  6. java中readLine()方法为什么有的行读不到?

    今天在使用java对IO操作时,readLine()输出到控制台的行少了很多.后来发现readLine()实际上是一次读取一行.如果我们不话readLine()读取的行内容赋给一个字符串的话,每直接调 ...

  7. JavaScript中的方法重载

    对js有些了解的人都知道,在js中根本就不存在像C#中的那种方法重载,而有的只是方法的覆盖,当你在js中敲入两个或多个同名的方法的时候,不管方法(函数)的参数个数怎么个不同,这个方法名只能属于最后定义 ...

  8. Service中事务不能回滚的解决方式(转)

    1.在service方法里面如果对异常进行了捕获的话,该事务是不会进行回滚的        默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚.          spr ...

  9. Android之线程回掉更新ui

    一:工作线程中的回掉更新UI public class MainActivity extends AppCompatActivity { private int i; private Callback ...

随机推荐

  1. 搭建Windows Azure开发环境-环境搭建

    虚拟机中运行 练习1:使用远程桌面连接到虚拟机 在本节中,你会登录到Windows Azure的门户网站,并使用Windows Azure库创建的Azure虚拟机. 任务1 -配置的Visual St ...

  2. cmder使用手册

    http://bliker.github.io/cmder/ 使其可以在Win+R中运行 将解压出的路径 放入系统变量 path中 如 :D:\software\cmder 解决中文错位 选个喜欢的字 ...

  3. puppet yum仓库

    http://tmz.fedorapeople.org/repo/puppet/epel/5/x86_64/ [epel-puppet] name=epel puppet baseurl=http:/ ...

  4. ASP.Net IE10 _doPostBack 未定义错误【转】

    --昨天发现IE10下面ReportViewer执行报表会报错,发现为Js报_doPostBack 未定义错误,查找相关资料发现问题为 当前framework不能识别IE10版本,把该浏览器做降级处理 ...

  5. javascript闭包问题

    <script type="text/javascript"> window.onload = function(){ var name = "The Win ...

  6. Dom4J对XML的创建、修改、删除等操作

    Dom4j也可以很方便完成XML文档的创建.元素的修改.文档的查询遍历等,但dom4j稍比jdom复杂一点,不过在大片文档的情况下dom4j的性能要不jdom好. # 准备 首先,提供相关的jar包 ...

  7. [转载](iPhone开发)Bundle Display Name 改为中文。ap

    原文地址:(iPhone开发)Bundle Display Name 改为中文.app显示为中文作者:小新 要先在info的Localizations加入Chinese(zh-Hant) 再進到inf ...

  8. UDF 编写自定函数

    在Mysql的官方文档中有说明如何给Mysql添加新的函数. 添加的函数可分为3种: .自行编写函数的源码,将源码编译成动态库,然后使用Mysql的CREATE FUNCTION语句来将函数添加进My ...

  9. 标准I/O库之临时文件

    ISO C标准I/O库提供了两个函数以帮助创建临时文件. #include <stdio.h> char *tmpnam( char *ptr ); 返回值:指向唯一路径名的指针 FILE ...

  10. Q_INIT_RESOURCE宏

      QT应用程序,无论是exe,staticlib,还是dll程序,都可以通过qrc文件来导入各种资源. qrc会将这些资源文件转换为相应代码,参与应用程序的编译. 这样做的好处就是:简化了应用程序发 ...