block用法和代理的,通知的区别.block用法的用法需要注意些什么

block 和 delegate 都可以通知外面。block 更轻型,使用更简单,能够直接访问上下文,这样类中不需要存储临时数据,使用 block 的代码通常会在同一个地方,这样读代码也连贯。delegate 更重一些,需要实现接口,它的方法分离开来,很多时候需要存储一些临时数据,另外相关的代码会被分离到各处,没有 block 好读。
应该优先使用 block。而有两个情况可以考虑 delegate。
1. 有多个相关方法。假如每个方法都设置一个 block, 这样会更麻烦。而 delegate 让多个方法分成一组,只需要设置一次,就可以多次回调。当多于 3 个方法时就应该优先采用 delegate。
比如一个网络类,假如只有成功和失败两种情况,每个方法可以设计成单独 block。但假如存在多个方法,比如有成功、失败、缓存、https 验证,网络进度等等,这种情况下,delegate 就要比 block 要好。
在 swift 中,利用 enum, 多个方法也可以合并成一个 block 接口。swift 中的枚举根据情况不同,可以关联不同数据类型。而在 objc 就不建议这样做,objc 这种情况下,额外数据需要使用 NSObject 或者 字典进行强转,接口就不够安全。
2. 为了避免循环引用,也可以使用 delegate。使用 block 时稍微不注意就形成循环引用,导致对象释放不了。这种循环引用,一旦出现就比较难检查出来。而 delegate 的方法是分离开的,并不会引用上下文,因此会更安全些。
假如写一个库供他人使用,不清楚使用者的水平如何。这时为防止误用,宁愿麻烦一些,笨一些,使用 delegate 来替代 block。
将 block 简单分类,有三种情形。
* 临时性的,只用在栈当中,不会存储起来。
比如数组的 foreach 遍历,这个遍历用到的 block 是临时的,不会存储起来。
* 需要存储起来,但只会调用一次,或者有一个完成时期。
比如一个 UIView 的动画,动画完成之后,需要使用 block 通知外面,一旦调用 block 之后,这个 block 就可以删掉。
* 需要存储起来,可能会调用多次。
比如按钮的点击事件,假如采用 block 实现,这种 block 就需要长期存储,并且会调用多次。调用之后,block 也不可以删除,可能还有下一次按钮的点击。
对于临时性的,只在栈中使用的 block, 没有循环引用问题,block 会自动释放。而只调用一次的 block,需要看内部的实现,正确的实现应该是 block 调用之后,马上赋值为空,这样 block 也会释放,同样不会循环引用。
而多次调用时,block 需要长期存储,就很容易出现循环引用问题。
Cocoa 中的 API 设计也是这样的,临时性的,只会调用一次的,采用 block。而多次调用的,并不会使用 block。比如按钮事件,就使用 target-action。有些库将按钮事件从 target-action 封装成 block 接口, 反而容易出问题。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:170957次
积分:3723
积分:3723
排名:第9107名
原创:171篇
转载:158篇
评论:16条
(9)(10)(4)(13)(5)(4)(8)(6)(4)(12)(5)(1)(4)(7)(11)(11)(6)(1)(17)(5)(14)(13)(7)(3)(2)(2)(7)(9)(4)(6)(31)(12)(15)(1)(3)(6)(5)(2)(10)(12)(3)(11)(16)
(window.slotbydup = window.slotbydup || []).push({
id: '4740887',
container: s,
size: '250,250',
display: 'inlay-fix'iOS开发中,block与代理的对比,双方的优缺点及在什么样的环境下,优先使用哪一种更为合适?
我的图书馆
iOS开发中,block与代理的对比,双方的优缺点及在什么样的环境下,优先使用哪一种更为合适?
【黄兢成的回答(41票)】:
block 和 delegate 都可以通知外面。block 更轻型,使用更简单,能够直接访问上下文,这样类中不需要存储临时数据,使用 block 的代码通常会在同一个地方,这样读代码也连贯。delegate 更重一些,需要实现接口,它的方法分离开来,很多时候需要存储一些临时数据,另外相关的代码会被分离到各处,没有 block 好读。
应该优先使用 block。而有两个情况可以考虑 delegate。
1. 有多个相关方法。假如每个方法都设置一个 block, 这样会更麻烦。而 delegate 让多个方法分成一组,只需要设置一次,就可以多次回调。当多于 3 个方法时就应该优先采用 delegate。
比如一个网络类,假如只有成功和失败两种情况,每个方法可以设计成单独 block。但假如存在多个方法,比如有成功、失败、缓存、https 验证,网络进度等等,这种情况下,delegate 就要比 block 要好。
在 swift 中,利用 enum, 多个方法也可以合并成一个 block 接口。swift 中的枚举根据情况不同,可以关联不同数据类型。而在 objc 就不建议这样做,objc 这种情况下,额外数据需要使用 NSObject 或者 字典进行强转,接口就不够安全。
2. 为了避免循环引用,也可以使用 delegate。使用 block 时稍微不注意就形成循环引用,导致对象释放不了。这种循环引用,一旦出现就比较难检查出来。而 delegate 的方法是分离开的,并不会引用上下文,因此会更安全些。
假如写一个库供他人使用,不清楚使用者的水平如何。这时为防止误用,宁愿麻烦一些,笨一些,使用 delegate 来替代 block。
将 block 简单分类,有三种情形。
* 临时性的,只用在栈当中,不会存储起来。
比如数组的 foreach 遍历,这个遍历用到的 block 是临时的,不会存储起来。
* 需要存储起来,但只会调用一次,或者有一个完成时期。
比如一个 UIView 的动画,动画完成之后,需要使用 block 通知外面,一旦调用 block 之后,这个 block 就可以删掉。
* 需要存储起来,可能会调用多次。
比如按钮的点击事件,假如采用 block 实现,这种 block 就需要长期存储,并且会调用多次。调用之后,block 也不可以删除,可能还有下一次按钮的点击。
对于临时性的,只在栈中使用的 block, 没有循环引用问题,block 会自动释放。而只调用一次的 block,需要看内部的实现,正确的实现应该是 block 调用之后,马上赋值为空,这样 block 也会释放,同样不会循环引用。
而多次调用时,block 需要长期存储,就很容易出现循环引用问题。
Cocoa 中的 API 设计也是这样的,临时性的,只会调用一次的,采用 block。而多次调用的,并不会使用 block。比如按钮事件,就使用 target-action。有些库将按钮事件从 target-action 封装成 block 接口, 反而容易出问题。
【Cyandev的回答(0票)】:
其实 Delegate 模式和 block 语法都是用来解决对象间交互的情况,关于开发中使用哪个其实并没有太明确的界限,Cocoa 本身在设计的时候比较多利用到的是 Delegate,这可能与 block 语法出现较晚有关。
Delegate 的场景还是比较常见的,它适用于调用相对频繁,可重复调用的情景,比如各种 DataSource,这种情况下一个对象想通过委托来获取某些数据,我们可以理解为 Delegate 是一种不易改变的属性,而 block 常用于临时的通知或者几位简单的回调(可以参考 NSURLSession 以及各种认证回调),我们通常会在 block 中做一些比较轻量的工作。
至于优缺点,Delegate 的优点有:通常被 weak 引用,不会出现内存泄漏的问题;可以将一组相关的方法集合在一起。缺点可能就是比较麻烦吧,要写好长的 protocol 方法名...
block 优点很显著,那就是方便,基本 inline 就能完成一个 block 的传递,当然缺点也十分明显,各种 retain cycle 绝大多数都是由 block 导致的,这点在开发中还是需要注意的。
总之,这个还是要看个人偏好和团队风格。比如我在做一些开源库的时候我就比较喜欢使用 Delegate,它的 document 可以做得比较完善,对于使用者来说会更友善。而我使用 block 的情景要不就是简单的回调,或者在方法中定义 sub-routine 以重用(有点像高级版 goto,可能是我代码逻辑组织得不好吧……)。
手机码字,排版可能不好,大家将就。
【尤尤的回答(0票)】:
block当然好啦,不用写那么delegate 方法去遵循,一个回调完事,当然啦,最怕就是引用循环,还有就是这个block是在哪个线程回调的,有的block在主线程,有的block在线程,有大神可以告诉我,如何判断block在哪个线程调用么
馆藏&68126
TA的推荐TA的最新馆藏
喜欢该文的人也喜欢Pages: 1/2
主题 : 【加粗!】delegate,block,notification三者区别?
级别: 侠客
UID: 238814
可可豆: 413 CB
威望: 349 点
在线时间: 121(时)
发自: Web Page
来源于&&分类
【加粗!】delegate,block,notification三者区别?&&&
如题,我们经常在开发中遇到各种回调的时候,delegate,block,以及通知以上三者经常用到。但是,我不知道三者的详细区别,应该在什么样的情况下该选用哪种方式?哪种效率好?哪种比较科学?心里也只是模模糊糊的一个影子,也说不出来,请各位资深的开发者根据自身的经验或者大家都比较认同的想法,科普一下呗
二次元的神啊带我走吧~
级别: 侠客
UID: 238814
可可豆: 413 CB
威望: 349 点
在线时间: 121(时)
发自: Web Page
我就造,发在这里肯定没人
二次元的神啊带我走吧~
级别: 精灵王
UID: 96411
发帖: 1690
可可豆: 8293 CB
威望: 8330 点
在线时间: 3940(时)
发自: Web Page
回 1楼(walker_l) 的帖子
通知:“一对多”,在APP中,很多控制器都需要知道一个事件,应该用通知;delegate:1,“一对一”,对同一个协议,一个对象只能设置一个代理delegate,所以单例对象就不能用代理;2,代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败block:1:写法更简练,不需要写protocol、函数等等2,block注重结果的传输:比如对于一个事件,只想知道成功或者失败,并不需要知道进行了多少或者额外的一些信息3,block需要注意防止循环引用:ARC下这样防止:__weak typeof(self) weakSelf =&&[yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {&&&&&& [weakSelf doSomething];&&&&}];非ARC__block typeof(self) weakSelf =&&[yourBlock:^(NSArray *repeatedArray, NSArray *incompleteArray) {&&&&&& [weakSelf doSomething];&&&&}];=======================================================================================================================================个人总结,不对的地方大家指出,共同讨论。
减少对别人的依赖,                                   才能告别菜鸟时代。
级别: 侠客
UID: 367243
可可豆: 916 CB
威望: 572 点
在线时间: 369(时)
发自: Web Page
回 1楼(walker_l) 的帖子
有人飘过 &&&&&&&&
级别: 侠客
UID: 238814
可可豆: 413 CB
威望: 349 点
在线时间: 121(时)
发自: Web Page
回 2楼(下雨天、轮滑) 的帖子
谢谢斑竹大大了!
二次元的神啊带我走吧~
级别: 新手上路
可可豆: 3 CB
威望: 3 点
在线时间: 109(时)
发自: Web Page
回 2楼(下雨天、轮滑) 的帖子
它们是同步调用还是异步?
级别: 侠客
可可豆: 172 CB
威望: 172 点
在线时间: 498(时)
发自: Web Page
消息能实现一对多,使用场合较多,比如APPDelegate将推送消息发给多个ViewController,但是一定要注意,一旦接收消息的对象多了,就难以控制了,可能有你不希望的对象接受了消息并做了处理,另外一旦注册了观察者,在dealloc里面一定要移除;代理在我看来是个不合理的存在,想一下你只想传个参数,却要声明代理,创建协议方法,然后在适当的时候让代理调方法,同时传参。何必呢?何苦呢?block就不像代理那么麻烦,传参直接带在括号里面。
级别: 骑士
UID: 159156
可可豆: 1478 CB
威望: 1119 点
在线时间: 881(时)
发自: Web Page
delegate运行成本低。block成本很高的。block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者block置nil后才消除;delegate只是保存了一个对象指针,直接回调,没有额外消耗。相对C的函数指针,只多做了一个查表动作
We Can Manage!
级别: 版主
UID: 512733
可可豆: 2476 CB
威望: 1921 点
在线时间: 1021(时)
发自: Web Page
回 2楼(下雨天、轮滑) 的帖子
您好 想问下&&一个类不是可以遵循多个协议吗? 为什么是一对一 没有看懂
级别: 版主
UID: 209194
发帖: 4845
可可豆: 7788 CB
威望: 8028 点
在线时间: 1157(时)
发自: Web Page
回 2楼(下雨天、轮滑) 的帖子
膜拜技术大牛 &&&&
维多利亚没有秘密!
Pages: 1/2
关注本帖(如果有新回复会站内信通知您)
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 关注CVP公众号
扫一扫 浏览移动版delegate与block一般用于两个对象1对1之间的通信交互、delegate需要定义协议方法,代理对象需要实现协议方法
并且需要建立代理关系才可以实现通信。
block更加简洁,不需要定义繁琐的协议方法,但是如果通信时间比较多的话,建议使用delgate。
Notfication主要用于1对多的通信,而且通信对象之间不需要建立关系,但是使用通知,代码的可读性差。
本文已收录于以下专栏:
相关文章推荐
文/yeahming(简书作者)
原文链接:/p/
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
1.代理(delegate)传值 ----
顾名思义就是委托别人办事,就是当一件事情发生后,自己不处理,让别人来处理。
    实质就是:比如右AB两个页面,A想要传值给B ,就只要先在A中得到B的...
iOS开发Delegate,Notification,Block使用心得(一)简要介绍
1.Delegate(代理、委托)
代理几乎是iOS开发中最常用的传值方式,在项目中的AppDelegate...
1、通知中心(NSNotificationCenter)
    a、每一个应用程序都有一个通知中心(NSNotificationCenter)实例,专门负责协助不同对象之间的消息通信
    b...
不多说直接上代码
TestDelegateView.swift
blockAndDelegate
Created by jarvis on ...
消息的发送者(sender)告知接收者(receiver)某个事件将要发生,delegate同意然然后发送者响应事件,delegate机制使得接收者可以改变发送者的行为。通常...
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
在IOS开发中,有一个非常常见的定义,就像property一样,它就是protocol。
他的最新文章
讲师:王哲涵
讲师:王渊命
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 ios 代理 通知 block 的文章

 

随机推荐