iOS中常用的几种传值方式

来源:互联网 发布:innodb和myisam 大数据 编辑:程序博客网 时间:2024/06/07 16:42

1. 通知 (NSNotification) ()

定义: 消息的发送者告知接受者事件将要发送或者已经发生,接收者不能反过来影响发送者的行为(发送者不关心接受者的态度,我只管负责发送,你接不接受是里的事情,往往用到did这个词).

使用流程: (1)注册通知中心(NSNotificationCenter); (2)程序运行时接收通知.

使用时机: 主要用于1对多情况下的通信, 对象之间不需要建立关系. 例如多线程之间的传值.

注意: 代码可读性差 . 

与KVO的区别: 可以检测的内容比较多, 但是需要被观察者手动发送通知, 观察者才能响频,


2. 代理 (delegate) (属性用assign)

定义: 又称为 委托或代理, 是一种设计模式,主要用于两个对象之间的通信交互,解除两个对象之间的耦合性, 主要用于视图和使用对象之          间的通信.  接受者可以改变发送者的行为(需要关注返回值, 比如你是我的代理, 我想做某件事你愿意吗?你需要给我一个答案,我根据你的答案做下一步安排,往往用到should这个词).

使用流程: 需要定义协议方法,代理签署协议,实现协议方法;

使用时机: 用于两个对象之间1对1的通信, 如果通信事件比较多的话,建议使用delegate;

注意: delegate 比 通知效率高.


3. Block

定义: 闭包, 能够读取其他函数内部变量的匿名函数.

实现原理: block实际上是指向结构体的指针, 编译器会将block的内部代码生成对应的函数.

使用流程: 比协议简洁,不需要定义繁琐的协议,

使用时机: 用于两个对象之间1对1的通信, 适用于只回调一次的简单任务.

注意: 内存管理: 在ARC环境下使用__block修饰变量, 在MRC环境下使用__weak修饰变量, 在block中不能直接使用self.(需要先将self赋值给一个临时变量) , 因为self会持有这个对象,引起循环引用; 

与函数的区别: 与C里面的函数类似, 都可以作为参数进行传递,用于回调. 但block的实现可以定义在方法中(可以访问方法中的局部变量,使代码更加紧凑,结构化),函数则不可以.


4. KVO (观察)

定义: 键值观察,被观察的对象必须使用KVC键值编码来修改它的实例变量, 这样才能被观察者观察到,因此可以说KVO是建立在KVC的            基础之上的.

实现原理: KVO的内部实现是基于runtime的, 重写一个setter方法, 实现真正的通知机制.

使用流程: (1) 需要在接收通知的地方注册观察者; (2) 被观察的key发生变化时,发送通知.

使用时机: 当需要检测某一对象的属性值的变化时

与NSNotification的区别: 只能检测属性的变化, 但是实现了自动检测, 当属性值变化时会自动通知观察者,不用在添加代码了.


5.单例传值

使用时机: 当一个类在全局中只需要一个对象时,使用单例能包装整个程序中的数据都是一样的

具体见上一篇文章:http://blog.csdn.net/cheng_xiaocheng/article/details/49704107


0 0