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

时间: 2024-11-09 11:14:20

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

layer插件open方法回掉值问题

最近做项目需用到一个弹出层加载iframe页面的东西,首先想到layer插件,此插件用到过多次,兼容性很好,功能也强大,废话不多说上代码. 其实功能很简单,就是在目标页面选择一个值,回掉回来,说明一下主要的代码. $("#ChoiceBank").click(function () { var width = $("#content").css("Width"); layer.open({ type: 2, title: '开户银行选择', ar

simple_udp_register中回掉函数解析

simple-udp.c中的simple_udp_register()函数的解析,重点为回掉函数,结合broadcast-udp.c这个例子对其进行分析. broadcast-udp.c是基于simple-udp的一个广播数据报的例子. int simple_udp_register(structsimple_udp_connection *c, uint16_t local_port, uip_ipaddr_t *remote_addr, uint16_t remote_port, simpl

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

缓动函数中opcity  写百分值的值 JS一般不用小数运算,会照成精度丢失 元素的默*认透明度是 层级一次性赋值,不缓动 利用for-in为同一个父元素的子元素绑定属性 缓动框架兼容封装/回掉函数/兼容透明度/层级 function animate(ele,json,fn){ //先清定时器 clearInterval(ele.timer); ele.timer = setInterval(function () { //开闭原则 var bool = true; //遍历属性和值,分别单独处

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

如果我们在网络开发中,特别是大访问量的web项目开发中,为了提高响应速度,减少数据查询运算,那么我们都会选用memcahce.首先我们必须要安装,接下来如何使用memcache,在这里介绍下在linux下安装和windows下安装如下及配置: 一. linux下的Memcache安装: 1.下载memcache的linux版本,注意 memcached 用 libevent 来作事件驱动,所以要先安装有 libevent. 2. 安装 pecl::memcache. 用 pecl 命令行工具安装

Spring中@Transactional事务回滚实例及源码

一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除某个部门的时候,假设我们默认删除对应的成员.但是在执行的时候可能会出现这种情况,我们先删除部门,再删除成员,但是部门删除成功了,删除成员的时候出异常了.这时候我们希望如果成员删除失败了,之前删除的部门也取消删除.这种场景就可以使用@Transactional事物回滚. 二.checked异常和unc

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

1.在service方法里面如果对异常进行了捕获的话,该事务是不会进行回滚的        默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚.          spring aop  异常捕获原理:被拦截的方法需显式抛出异常,并不能经任何处理,这样aop代理才能捕获到方法的异常,才能进行回滚,默认情况下aop只捕获runtimeexception的异常,但可以通过配置来捕获特定的异常并回滚,换句话说在service的方法中不使用try catch 或者在catc

java中的方法理解

1.java 方法的格式<修饰符><返回类型><方法名>(<参数列表>)返回类型说明了方法的返回值类型,如果不需要返回值,返回类型应该声明为void,需要返回值的,必须与说明的返回类型相同.2.如果一个方法的参数定为不定参数的话,这个参数可以根据参数个数动态生成一个数组,然后传入方法执行.不定参数有两个规定:方法的参数列表中最多只有一个不定长度的参数:不定长度的数组的位置必须是最后一个参数.不然不能通过编译.3.java中每个方法的返回值,有且仅有一个,因为

Spring中@Transactional事务回滚(含实例详细讲解,附源码)

原文出处: 小宝鸽 一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除某个部门的时候,假设我们默认删除对应的成员.但是在执行的时候可能会出现这种情况,我们先删除部门,再删除成员,但是部门删除成功了,删除成员的时候出异常了.这时候我们希望如果成员删除失败了,之前删除的部门也取消删除.这种场景就可以使用@Transactional事物回滚. 二.che

自定义带进度条的WebView , 增加获取web标题和url 回掉

1.自定义ProgressWebView package com.app.android05; import android.content.Context; import android.graphics.Bitmap; import android.util.AttributeSet; import android.webkit.WebView; import android.webkit.WebViewClient; import android.widget.ProgressBar; /