iOS中消息传递方式 - 07

一.通知:在iOS中由通知中心进行消息接收和消息广播,是一种一对多的消息传递方式。

二.代理:是一种通用的设计模式,iOS中对代理支持的很好,由代理对象、委托者、协议三部分组成。

三.block:iOS4.0中引入的一种回调方法,可以将回调处理代码直接写在block代码块中,看起来逻辑清晰代码整齐。

四.target action:通过将对象传递到另一个类中,在另一个类中将该对象当做target的方式,来调用该对象方法,从内存角度来说和代理类似。

五.KVO:NSObject的Category-NSKeyValueObserving,通过属性监听的方式来监测某个值的变化,当值发生变化时调用KVO的回调方法。

.....当然还有其他回调方式,这里只是简单的列举。

一:Target-action模式

主要是按钮,添加手势事件上面使用,

1、直接通过XIB上拖拽连线

2、以代码的方式实现

-(void)addTarget:(id)target action:(SEL)forControlEvents:(UIControlEvents)controlEvents

3、添加手势

二:block

涉及到block就必须说道:

1.C语言内存分配

Objective-C从名字来看就可以知道是一门超C语言,所以了解C语言的内存模型对于理解Objective-C的内存管理有很大的帮助。C语言内存模型图如下:

栈区(stack):存放函数的参数值、局部变量的值等,由编译器自动分配释放,通常在函数执行结束后就释放了,其操作方式类似数据结构中的栈。栈内存分配运算内置于处理器的指令集,效率很高,但是分配的内存容量有限,比如iOS中栈区的大小是2M。

堆区(heap):就是通过new、malloc、realloc分配的内存块,它们的释放编译器不去管,由我们的应用程序去释放。如果应用程序没有释放掉,操作系统会自动回收。分配方式类似于链表。

静态区:全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后,由系统释放。

常量区:常量存储在这里,不允许修改的。

代码区:存放函数体的二进制代码。

栈区和堆区的区别主要为以下几点:

对于栈来说,内存管理由编译器自动分配释放;对于堆来说,释放工作由程序员控制。

栈的空间大小比堆小许多。

栈是机器系统提供的数据结构,计算机会在底层对栈提供支持,所以分配效率比堆高。

栈中存储的变量出了作用域就无效了,而堆由于是由程序员进行控制释放的,变量的生命周期可以延长。

2.声明block属性的时候为什么用copy呢?

MRC环境下:访问外界变量的block默认存储在栈区。

ARC环境下:访问外界变量的block默认存放在堆中,实际上是先放在栈区,在ARC情况下自动又拷贝到堆区,自动释放。

使用copy修饰符的作用就是将block从栈区拷贝到堆区

通过官方文档可以看出,复制到堆区的主要目的就是保存block的状态,延长其生命周期。因为block如果在栈上的话,其所属的变量作用域结束,该block就被释放掉,block中的__block变量也同时被释放掉。为了解决栈块在其变量作用域结束之后被释放掉的问题,我们就需要把block复制到堆中

3.加上__block就可以修改block外面的变量了

在block不是作为一个property的时候,可以在block里面直接使用self,比如UIView的animation动画block。

当block被声明为一个property的时候,需要在block里面使用weakSelf,来解决循环引用的问题。

当和并发执行相关的时候,当涉及异步的服务的时候,block可以在之后被执行,并且不会发生关于self是否存在的问题。

三:代理

1.代理传值

2.代理 添加方法 

四:通知

五:KVO

你可能感兴趣的:(iOS中消息传递方式 - 07)