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 相类似。
Objective-C 中的方法回掉的更多相关文章
- layer插件open方法回掉值问题
最近做项目需用到一个弹出层加载iframe页面的东西,首先想到layer插件,此插件用到过多次,兼容性很好,功能也强大,废话不多说上代码. 其实功能很简单,就是在目标页面选择一个值,回掉回来,说明一下 ...
- redis-java中的callback回掉机制
springboot整合redis后, 会提供StringRedisTEmplate和 RedisTemplate 两个模板类供食用, 有时候这并不能满足我们的需求, 需要使用 connect 处理, ...
- Android PopupWindow 消失后的回掉方法
popupwindow 会在点击屏幕其他地方消失,但是这个消失时的回掉方法一直没有找到,困扰了一个多月,差了不少百度,没有很好解决,今天偶然看到了setOnDismissListener这个方法!没想 ...
- 使用Memcache在PHP中调试方法的介绍及应用
使用Memcache在PHP中调试方法的介绍及应用 如果我们在网络开发中,特别是大访问量的web项目开发中,为了提高响应速度,减少数据查询运算,那么我们都会选用memcahce.首先我们必须要安装,接 ...
- JS-特效 ~ 05. 缓动框架兼容封装/回掉函数/兼容透明度/层级、旋转轮播图、正则表达式、验证表单注册账号、
缓动函数中opcity 写百分值的值 JS一般不用小数运算,会照成精度丢失 元素的默*认透明度是 层级一次性赋值,不缓动 利用for…in为同一个父元素的子元素绑定属性 缓动框架兼容封装/回掉函数/ ...
- java中readLine()方法为什么有的行读不到?
今天在使用java对IO操作时,readLine()输出到控制台的行少了很多.后来发现readLine()实际上是一次读取一行.如果我们不话readLine()读取的行内容赋给一个字符串的话,每直接调 ...
- JavaScript中的方法重载
对js有些了解的人都知道,在js中根本就不存在像C#中的那种方法重载,而有的只是方法的覆盖,当你在js中敲入两个或多个同名的方法的时候,不管方法(函数)的参数个数怎么个不同,这个方法名只能属于最后定义 ...
- Service中事务不能回滚的解决方式(转)
1.在service方法里面如果对异常进行了捕获的话,该事务是不会进行回滚的 默认spring事务只在发生未被捕获的 runtimeexcetpion时才回滚. spr ...
- Android之线程回掉更新ui
一:工作线程中的回掉更新UI public class MainActivity extends AppCompatActivity { private int i; private Callback ...
随机推荐
- HUFFMAN 树
在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN) 树和哈夫曼编码.哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码应用广泛,如 JPEG中就应用了哈夫曼编码. 首先介绍什么 ...
- 【原】数据库SQL语句入门
1.数据定义DDL(Data Definition Language)语言即对表结构的一些定义,主要包括动词为CREATE/DROP/ALTER. 1.1.CREATE语句 CREATE TABLE ...
- 求正整数n所有可能的和式的组合(如;4=1+1+1+1、1+1+2、1+3、2+1+1、2+2
作者:张小二 nyoj90 ,可以使用递归的方式直接计算个数,也可以通过把满足的个数求出来计数,因为在juLy博客上看到整数划分,所以重写了这个代码,就是列出所m的可能性,提交后正确.acmer的入门 ...
- 如何从Windows Phone 生成PDF文档
我需要从我的Windows Phone应用程序生成PDF. 遗憾的是没有标准的免费的PDF生成库在Windows Phone上运行. 我不得不自己生成PDF,通过直接写入到文件格式. 这竟然是真的很容 ...
- 部署ActiveMQ的Share File System Master-Slave
之前在项目里用MQ是用单节点,因为业务量不大没有主从.这样风险很大,会有单点问题.新项目起来了,需要一个高可用的MQ,故研究了下AMQ的几种master-slave方式: 1.Pure Master- ...
- Linux下OpenSSL 安装
安装环境: 操作系统:CentOs6.3 OpenSSL Version:openssl-1.0.0e.tar.gz 目前版本最新的SSL地址为http://www.openssl.org/sour ...
- null值是不会算在count以内的
做统计的时候,null是不计算在count以内的.所以字段的值最好不要设置为null. 比如:select count(user_id) as beyond_num from fs_users_add ...
- 解决Debian-7.1下Chrome浏览器字体难看的问题
首先在 Advance Setting 的 font 标签页下做如下配置: 然后在用户目录下创建 .fonts.conf 文件,内容如下: <?xml version='1.0'?> &l ...
- 文件正在上传的转圈圈gif图片引出的fixed定位和absolute定位
文件正在上传的转圈圈gif图片 一.文件上传时,未上传返回成功状态之前给个gif动态图片显示在页面,改善用户体验. <!--S 遮罩层 --> <div id="mas ...
- wechat server的配置
一 服务器地址 https://github.com/donal-tong/wechat4server 包括源代码及数据库脚本放在dump文件夹里 1.根据sql脚本创建需要的数据库hcapi,然后命 ...