是什么/特性/优点,缺点。
- 代理: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块外地址相同;
外部变量存在栈中, 这个变量会被转移到堆区, 不是复制, 是转移。