美文网首页iOS面试基础知识点
p_代理、Block、通知、KVO

p_代理、Block、通知、KVO

作者: my__life | 来源:发表于2016-10-21 20:57 被阅读76次

是什么/特性/优点,缺点。

  1. 代理:delegate是委托模式.委托模式是将一件属于委托者做的事情,交给另外一个被委托者来处理。“一对一”,对同一个协议,一个对象只能设置一个代理delegate。
    步骤:写协议 ,设置代理这个属性, 然后在你想通知代理做事情的方法中调用即可。(整个过程怎么去写。)
    a。delegate只是保存了一个对象指针,直接回调,没有额外消耗。
    b。代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败。
    c。公共接口,方法较多也选择用delegate进行解耦。iOS有很多例子比如最常用tableViewDelegate,textViewDelegate。

2.Block:block和delegate一样,一般都是“一对一”之间通信交互,相比代理block有以下特点
a。block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者block置nil后才消除。delegate只是保存了一个对象指针,直接回调,没有额外消耗。∴block的运行成本比delegate要高。
b。写法更简练,不需要写protocol、函数等等
c。block注重结果的传输:比如对于一个事件,只想知道成功或者失败,并不需要知道进行了多少或者额外的一些信息
d。block需要注意防止循环引用
e。异步和简单的回调用block更好。iOS有很多例子比如常用的网络库AFNetwork,ASIHTTP库,UIAlertView类。

3.通知:一对多的形式,信息而且可以在任意对象之间传递,不需要二者有联系。
优势:a.不需要编写多少代码,实现比较简单;2.对于一个发出的通知,多个对象能够做出反应,即1对多的方式实现简单

缺点:a.在编译期不会检查通知是否能够被观察者正确的处理;
b.通知发出后,controller不能从观察者获得任何的反馈信息。
c.在释放注册的对象时,需要在通知中心取消注册;
d.在调试的时候应用的工作以及控制过程难跟踪;

通知VS代理:通知中心很难把握应用的执行流程。UserInfo dictionaries的keys到处传递导致失去了同步,而且在公共空间需要定义太多的常量。对于一个工作于现有的项目的开发者来说,如果过分的使用通知中心,那么很难理解应用的流程。我觉得使用命名规则好的协议和协议方法定义对于清晰的理解controllers间的通信是很容易的。努力的定义这些协议方法将增强代码的可读性,以及更好的跟踪你的app。当然会有delegation模式不适合的例外情况出现,而且notification可能更加有效。例如:应用中所有的controller需要知道一个事件。然而这些类型的场景很少出现。另外一个例子是当你建立了一个架构而且需要通知该事件给正在运行中应用。

4.KVO是。。。.它只能用来对属性作出反应,而不会用来对方法或者动作作出反应。

5.设计模式:代理模式、观察者模式(通知、KVO)、MVC模式、工厂模式

单例模式: 在整个项目中,一个类只有一个实例。它的这种特性,可以广泛应用于某些需要全局共享的资源中。比如:UIApplication、NSUserDefaults等都是IOS中的系统单例。

6.Block是什么:
1.你定义完block之后,其实是创建了一个函数,在创建结构体的时候把函数的指针一起传给了block,所以之后可以拿出来调用。
2.定义block的时候,变量a的值就传递到了block结构体中,仅仅是值传递,所以在block中修改a是不会影响到外面的a变量的。
3.而加了__block前缀,并不是直接传递a的值了,而是把a的地址传过去了,所以在block内部便可以修改到外面的变量了。
4.根据isa指针,block一共有3种类型的block
_NSConcreteGlobalBlock 全局静态
_NSConcreteStackBlock 保存在栈中,出函数作用域就销毁
_NSConcreteMallocBlock 保存在堆中,retainCount == 0销毁
而ARC和MRC中,还略有不同

1.一个block本质上就是一个函数指针,即那个代码快的内存地址。block常用作传值,实际上就是把block的地址传到要调用block的地方。

在Block中, 如果只使用全局或静态变量或不使用外部变量, 那么Block块的代码会存储在全局区;如果使用了外部变量, 在ARC中, Block块的代码会存储在堆区;

在ARC中, 外部变量存在堆中, 这个变量在Block块内与在Block块外地址相同;外部变量存在栈中, 这个变量会被copy到为Block代码块所分配的堆中;

如果需要修改外部变量, 需要在外部变量前面声明 __block
在ARC中, 外部变量存在堆中, 这个变量在Block块内与Block块外地址相同;
外部变量存在栈中, 这个变量会被转移到堆区, 不是复制, 是转移。

相关文章

  • p_代理、Block、通知、KVO

    是什么/特性/优点,缺点。 代理:delegate是委托模式.委托模式是将一件属于委托者做的事情,交给另外一个被委...

  • OC 底层(KVC、KVO、Delegate、Category、

    目录 1.KVC2.KVO3.通知4.代理、委托、协议5.Block、KVO、通知、代理之间的区别6.分类 Cat...

  • 代理/通知/block/KVO

    代理: 第一就是代理,这也是很常用的方式,特点是一对一的形式,而且逻辑结构非常清晰。实现起来较为简单:1.声明协议...

  • 代理/通知/block/KVO

    代理: 代理是 iOS 很常用的方式,它的特点就是一对一的形式,并且它的逻辑结构非常的清晰。实现起来也是比较简单的...

  • 代理、Block、通知、KVO

    1.代理代理是:。 2.Blockdelegate和block的作用都是用于两个类之间的回传数据,即当一个类创建了...

  • iOS面试(2)-设计模式

    一、MVC、MVP、MVVM、RAC 二、单例、工厂、KVC、KVO 三、通知、代理、Block

  • RAC

    代理、通知、block、kvo、Target都属于响应式编程 ReactiveObjc和通知有点像,但是RAC里创...

  • React-Native 与原生代码之间的事件传递

    熟悉 iOS 的同学都知道,controller 之间的事件传递有多种: 代理 block 通知 KVO 那么 R...

  • ReactiveCocoa基础篇

    ReactiveCocoa简介 使用了函数响应式编程思想 使用了HOOK思想 统一了代理,通知,Block,KVO...

  • ios开发中使用RAC代替block传值

    RAC可以实现KVO、代理、通知、block的功能,可谓集多功能于一身。本篇文章介绍RAC是如何代替block传值...

网友评论

    本文标题:p_代理、Block、通知、KVO

    本文链接:https://www.haomeiwen.com/subject/kmucuttx.html