iOS 代理与block 逆向传值 学习
一般在项目中出现逆向传值的时候就需要用到代理、block 或者通知中心了。由于公司的项目底层封装的很好,所以项目做了三四个月就算碰到需要逆传的情况也不用自己处理。但是最近遇到了一个特别的情况就需要自己处理一下了,之前也在网上看了一下关于如何选择代理、block 或者通知中心。个人感觉代理和通知中心都比较简单,block稍为有点复杂。代理大家都会用,所以当时就选用了通知中心来处理。之后有一次公司的网实在太差了,出现了逆传数据失败的情况,引起了我的注意,打上断点之后才发现,通知中心的那个方法完全没有调用,猛然一想才记起,公司的控制器是自己写的,在离开当前控制器的时候,已经解绑了,一般都是默认在销毁的时候才去解绑,可能公司是全局处理在离开画页的时候就这样处理了,
后面想用一下block这种看起来高档的做法,而且也比代理写起来简单。其实说起block也简单,就三步骤,定义block属性,调用block,设置block内容。
当然代理我们用起来更简单,因为太熟悉了,后一个控制器设置一个协议,设置一个delegate,,在前一个控制器跳转到后一个控制器的时候,指定后一个控制器的代理为前一个控制器,然后前一个控制器遵守协议,再实现这个协议里的方法,在这个方法里会有后一个控制器传过来的数据。
再理理block的顺序吧。
定义block,设置block, 调用block
定义block和调用block是在一个位置的
设置block在另一个位置
那么在哪里定义这个block,在哪里调用呢
要传递出数据的控制器的h文件中要定义这个block属性并且用copy,至于为什么用copy,好像是不用copy的话,block就在栈区,过了就销毁了,用了copy之后block就移到了堆上,就相当于对象了,大概是这个意思。
在要传递数据的控制器定义block属性,然后,这个block属性是否有控制器(另一个控制器)设置这个block。
为什么另一个控制器要设置这个block,在要传递数据的控制器定义block属性里一般都会把要传递的数据,当然参数传到block中,然后另一个控制器只有在设置这个block时,才能把这个传递过来的在block中的当作参数的数据,进行操作,比如设置到自己的控件,属性上。
传递数据方,定义block属性,判断自己的block属性是真(有值,即被数据接收方设置把传递出的数据设置在自己)
数据接收方,设置这个block,把block中的参数(传递的数据)处理到适合的地方(控件显示,子控件分发,属性保存再次处理)
iOS 代理与block 逆向传值 学习的更多相关文章
- iOS-Block总结 && 全面解析逆向传值
1.block的特点: block是C语言: block是一种数据类型.可以当做参数,也可以用做返回值:--总之,对比int的用法用即可(当然,定义的时候,最好跟函数对比): ...
- swift-delegate(代理)或者block传值
1:delegate或者block传值 import UIKit class ViewController: UIViewController,TestDelegatePassValueDelegat ...
- iOS开发系列-Block
概述 在iOS 4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调.这不免让我们想到在C函数中,我们可以定义一个指向函数的指针并且调用. #im ...
- iOS 开发之Block
iOS 开发之Block 一:什么是Block.Block的作用 UI开发和网络常见功能的实现回调,按钮事件的处理方法是回调方法. 1. 按钮事件 target action 机制. 它是将一 ...
- IOS中的Block与C++11中的lambda
ios中的block 可以说是一种函数指针,但更确切的讲,其实际上其应该算是object-c对C++11中lambda的支持或者说是一个语言上的变体,其实际内容是一样的,C++的lambda我已经有简 ...
- 代理和block反向传值
代理传值: // SendViewController.h #import <UIKit/UIKit.h> @protocol SendInFor <NSObject> -(v ...
- QF——iOS代理模式
iOS的代理模式: A要完成某个功能,它可以自己完成,但有时出于一些原因,不方便自己完成.这时A可以委托B来帮其完成此功能,即由B代理完成.但是这个功能不是让B随随便便任其完成.此时,会有一个协议文件 ...
- iOS安全些许经验和学习笔记
http://bbs.pediy.com/showthread.php?t=209014 标题: [原创]iOS安全些许经验和学习笔记作者: MonkeyKey时间: 2016-03-30,16:32 ...
- iOS开发关于Block代码错误
本文永久地址为http://www.cnblogs.com/ChenYilong/p/4052362.html ,转载请注明出处. iOS开发关于Block代码错误 Incompatible bloc ...
随机推荐
- [Python] 利用commands模块执行Linux shell命令
http://blog.csdn.net/dbanote/article/details/9414133 http://zhou123.blog.51cto.com/4355617/1312791
- MySQL初始化简单优化
1,yum 2,源码 3,二进制 4,源码+yum 不管哪种方式装完成数据库,都需要对数据库做一些优化. 优化数据库 mysql> select host,user from mysql.us ...
- solaris之复习
1.在vmware 下面加一个硬盘 参考资料:http://bbs.51cto.com/thread-483151-1.html VMWare上solaris 加硬盘的方法(笨办法及新思路 ...
- 本地RUN页面时候,将异常直接显示出来,而不是乱码
本地运行页面时,经常会遇到以下错误 oracle.jbo.JboException: JBO-29000: JBO-29000: JBO-26028: ???? MemberAttributesDis ...
- HTTP基础(一):如何使用浏览器network查看请求和响应的信息
一. 问题描述 HTTP作为前端开发与后开发链接的载体,其重要性不言而喻,今天我不复习关于HTTP自身的一些知识,只复习如何解读浏览器自带的的抓包工具(查看请求信息与响应信息)network. 二. ...
- [matlab]改变矩阵的大小并保存到txt文件
要完成的任务是,加载一个保存在txt文件中的矩阵, 并把它扩大10倍,并且要再次保存回去 %加载txt文件 >load('Matrix.txt'); %扩大10倍 repmat(Matrix,r ...
- ubuntu apt-get修改源地址
亲测搜狐可用,其他备用 1.修改源地址:cp /etc/apt/sources.list /etc/apt/sources.list.bakvim /etc/apt/sources.list 修改之后 ...
- ARP 命令运行实现静态IP/MAC绑定
公司网络出现本地无法连接,以前公司是分配的固定IP,结果还是无法连接网络,后来网管帮我设置了下,我也学习了下.解决办法如下: 1.首先以管理员身份运行CMD打开命令行程序 开始-程序-附件-命令提示符 ...
- Flex ObjectHandles 构建绘图程序!
模型 主画布组件:com/components/graph/GraphContainer.mxml <?xml version="1.0" encoding="ut ...
- AngularJS开发指南15:AngularJS的创建服务,将服务注入到控制器,管理服务依赖详解
创建服务 虽然AngularJS提供了很多有用的服务,但是如果你要创建一个很棒的应用,你可能还是要写自己的服务.你可以通过在模块中注册一个服务工厂函数,或者通过Module#factory api或者 ...