通知、代理、block

通知、代理、block 是iOS中的三大回调方式。

通知

NSNotificationCenter,它就像一个广播基站,发送一条消息,在所有的添加监听的地方都能够收到此信息,并作出不同或者着相同的动作,范围更广大,功能更强大

特点:“一对多”,“多对一”关系;通知的发送者根本不管接受者是否接受到了通知,也不管接收到通知后做什么操作,只管发,发送之后就跟他没什么关系了。

场景:一对多传值、跨控制器传值,关系层次比较深的两个对象通信,还有就是 全局广播属性和权限机制(键盘回收,程序进入后台等)

注意点:观察者对象在释放前一定要将通知中心注销掉,否则将出现不可预见的crash;一旦消息的接受者过多,就难以控制,可能有你不希望的对象接受了消息并做了处理

优点:使用简单,解决了同时向多个对象监听相应的问题,传值方便快捷

缺点:无法检测到通知中心是否正在处理接受的消息;调试时很难跟踪动作;消息发送者在发送消息的时候不能获取任何反馈信息等。

代理

代理几乎是iOS开发中最常用的回调方式,在项目中的AppDelegate就是使用的这种设计模式,不仅如此,还有很多原生的控件也使用的这种设计模式,比如:UITextFiled,UITableView等等。

特点:“一对一”,对同一个协议,一个对象只能设置一个delegate;代理注重过程信息的传输,如,消息是否发送到,是否收到消息,消息是否发送完毕等

场景:公共接口、方法较多选用delegate进行解耦如,AFNetworking等;UI事件响应,如UITableViewDelete,UITextViewDelete等

注意:单例对象不能用delegate;代理执行协议方法时,要先检测代理对象是否为nil,并用respondsToSelector检测其代理是否符合协议(检查对象能否响应指定的消息),以避免代理在回调时因为没有实现方法而造成程序崩溃

优点:减少代码耦合,使事件监听和事件处理相分离;语法定义清晰,减少维护成本,代码可读性较强等

缺点:实现委托的代码过程比较繁琐;跨层传值监听将会加大代码的耦合性,并且使程序的层次结构变得混乱;当多个对象同时传值响应时,delegate的易用性大大降低;多弹窗时代理需要区别来源。

block

block是一个能够访问其他函数内部变量的函数,不论是原生的框架还是第三方的框架,我们都可以看到Block的身影,Block强大的功能性和易用性使得深受架构师的喜爱。

特点:"一对一"关系;注重结果,只关注是否成功。

场景:UIVIew动画;数据请求回调;枚举回调;GCD等

注意:防止循环引用

优点:语法简洁,代码紧凑;增强代码的可读性和可维护性;配合GCD可以很好地解决多线程问题;多弹窗时,block在创建时就区分了来源;

缺点:容易造成内存泄露;容易造成循环引用;

你可能感兴趣的:(通知、代理、block)