代理和block各自的优缺点和使用场景

ios 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 接口, 反而容易出问题。
iOS Block使用教程 iOS的block是学习的难点和重点,熟练使用block可以达到代码的简单高效,特别是在网络的使用过程中。Block demo是一个简单易学的,可以便于学习原理。 立即下载

相关推荐

MATLAB数据可视化:pcolor函数从入门到精通(附colormap调色秘籍)

本文深入解析MATLAB中pcolor函数的数据可视化应用,从核心机制、坐标网格指定到常见陷阱规避。重点揭秘colormap调色秘籍,涵盖内置色系选用原则、个性化定制方法及高级渲染技巧,助你创作出信息准确、视觉出色的专业图表,精通从数据到出版级图表的全流程。

kafka6courier的博客 247

block和delegate区别以及使用

作者:黄兢成 链接:https://www.zhihu.com/question/29023547/answer/109570584 来源:知乎 著作权归作者所有,转载请联系作者获得授权。 block 和 delegate 都可以通知外面。block 更轻型,使用更简单,能够直接访问上下文,这样类中不需要存储临时数据,使用 block 的代码通常会在同一个地方,这样读代码也连贯。del

chenya866的专栏 799

AArch64 ARM64 寄存器介绍

除了上述通用寄存器,还有FPSR(浮点状态寄存器)和 FPCR(浮点控制寄存器)等。X29寄存器和X30寄存器在函数调用和堆栈帧的管理中扮演着关键角色。AArch64架构提供了31个通用寄存器,每个寄存器都可以用作64位X寄存器(X0~X30)或32位W寄存器(W0~W30)。使用X寄存器将导致64位的计算,使用W寄存器将导致32位的计算。EL0、EL1、EL2和EL3是AArch64架构中定义的四个特权级别(Exception Levels),用于支持不同的执行环境和特权级别。

lml435035844的博客 1万+

swift5学习之旅之代理通知block的使用

swift5学习之旅----代理通知block的使用 工程文件(全是button类型的调用) Github还没上传,先用着Dropbox(可能要翻墙),看完有收获的感谢点个赞????,如果翻不了墙要代码可以私聊我 https://www.dropbox.com/sh/wbo7lwpphi8ibn9/AAAWxUOj0PRKDlTNfpPz_A11a?dl=0 dropbox代理通知block的使用 Protocol(协议)的作用: 一、定义一套公用的接口(Public) @required:必须

SCDNBB的博客 761

基于Autoware制作高精地图(一)

基于Autoware制作高精地图(一) ​开始进入正题,也是最近在忙的一件事,制作高精地图。 高精地图的制作大概分为以下四个流程(不一定完全正确): 1.构建点云地图; 2.点云地图标注; 3.制作OpenDrive地图; 4.地图存储索引。 这篇文章主要讲解如何构建点云地图。 首先我们要有一段自己录制的激光雷达点云数据,这里推荐大家采用Velodyne16线激光雷达,因为这里我们构建的点云底图是三维的,而采用Velodyne而不是速腾聚创(rslidar)等其他品牌的原因是Autoware里面有一个选项是

weixin_44570248的博客 7800

《科研伦理与学术规范》期末考试答案2023

26单选(2 分)某学术杂志的评稿人同时是某高校相关专业的硕士生导师,在评判一个稿件的时候,他发现该作者研究的题目很有价值, 他便一边压下这个稿子,一边将稿子的纲要传给自己门下的硕士生, 指导他们使用这个题目独立写出一篇论文,并帮助他们发表在其他期 刊上。D.要善待实验动物,是指在饲养管理和使用实验动物过程中,要采取有效措施,使实验动物免遭不必要的伤害、饥渴、不适、惊恐、折磨、疾病和疼痛,保证动物能够实现自然行为,受到良好的管理与照料,为其提供清洁、舒适的生活环境。张某在压力之下不得不屈从。

Glenseeds的博客 4万+

block与delegate的区别

  1.从源头上理解和区别block和delegate delegate运行成本低,block的运行成本高。 block出栈需要将使用的数据从栈内存拷贝到堆内存,当然对象的话就是加计数,使用完或者block置nil后才消除。delegate只是保存了一个对象指针,直接回调,没有额外消耗。就像C的函数指针,只多做了一个查表动作。 2.从使用场景区别block和delegate 有多个相关方...

HumorousGhost 1415

基于结构的虚拟筛选模型 gnina 从源码编译

所需要的软件安装包: 安装 CUDA 装的时候看着点,第二个要你装驱动的选择,回答N,不装。 sudo sh cuda_10.0.130_410.48_linux.run sudo vim ~/.bashrc 在 ~/.bashrc 文件最后加上 export PATH=/usr/bin:/usr/local/cuda-10.0/bin${PATH} export LD_LIBRARY_PATH=/usr/local/cuda-10.0/lib64:${LD_LIBRARY_PATH} source ~

周迪新的博客 3189

block、delegate比较

block、delegate比较: block和delegate都能实现回调传值,完成对象之间的通信和交互。 block优缺点 代码变得连贯,使用也简单,一般不需要存储临时数据,能够直接访问上下文。 block缺点: block不够安全,使用 block 时稍微不注意就形成循环引用,导致对象释放不了。这种循环引用,一旦出现就比较难检查出来。 block效率低,block出栈需要将使用的数据从栈内存拷贝到堆内存 在多个通信事件的时候,block显得不够直观也不易维护。 delegate优缺点:

onebutterfly 626

Claude Code auto mode 管理 subagents 的三道安全闸门

文章摘要: Claude Code的auto mode核心在于重构多代理协作的安全边界,将信任拆解为三个检查点:任务委派前评估主会话指令是否越界(v2.1.178新增);执行中强制subagent继承主会话权限模式,禁止自行降级;返回前审查完整动作历史并附加安全警告。这种设计通过动态运行时约束(classifier)与多层防线(tools限制、hooks等)结合,避免安全策略分散化。auto mode并非完全放权,而是通过减少常规提示+后台严格检查实现平衡,与隔离环境专用的bypassPermissions

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 73

SAP:SAP的内存管理详解

SAP 的内存管理是一个复杂的多层机制,涉及应用服务器、数据库和操作系统的协同工作。通过合理配置和优化,可以显著提高 SAP 系统的性能和稳定性。

baidu_35680696的博客 1212

iOS 代理和block区别

共同点:都是进行单一回调。 delegate: 1.delegate是对象,对同一个协议,一个对象只能设置一个代理delegate。 2.注重过程信息的传输,比如网络请求,是否开始、是否收到数据、数据接收完成或者失败。 block: 1.写法更精简,不需要写protocol、函数等。 2.注重结果的传输;只想知道成功或者失败。 3.

weixin_38401994的博客 493

【100%通过率】华为OD机试真题 C 实现【最多等和不相交连续子序列】【2022.11 Q4 新题】

给定一个数组,我们称其中连续的元素为连续子序列,称这些元素的和为连续子序列的和。数组中可能存在几组连续子序列,组内的连续子序列互不相交且有相同的和。求一组连续子序列,组内子序列的数目最多。输出这个数目。

MISAYAONE的博客 1万+

iOS block和代理的区别

  block和代理是iOS开发中实现回调的两种方式,大多数情况下是用哪个都可以,主要看个人喜好。本文主要是对两者做一下对比。 1.block简介   在 iOS中, block一共分三种。   (1)全局静态 block,不会访问任何外部变量,执行完就销毁。 ^{ NSLog(@"Hello World!"); }();   (2)保存在栈中的 block,当函数返回时...

weixin_34112181的博客 293

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

通知/代理/block 三者比对

通知: “一对多”,”多对一” 传值四个步骤:1.发送通知2.创建监听者3.接收通知4.移除监听者 使用场景:1- 很多控制器都需要知道一个事件,应该用通知;2 - 相隔多层的两个控制器之间跳转注意事项: 1, 一旦接收消息的对象多了,就难以控制了,可能有你不希望的对象接受了消息并做了处理2,创建了观察者,在dealloc里面一定要移除;—————————————————...

weixin_30823001的博客 109

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

delegate与block以及nofication

通知:“一对多”,在APP中,很多控制器都需要知道一个事件,应该用通知;delegate:1,“一对一”,对同一个协议,一个对象只能设置一个代理delegate,所以单例对象就不能用代理;2,代理更注重过程信息的传输:比如发起一个网络请求,可能想要知道此时请求是否已经开始、是否收到了数据、数据是否已经接受完成、数据接收失败block:1:写法更简练,不需要写protocol、函数等等2,...

dengshaoliao3806的博客 183

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

块语法Block在MVC思维的妙用之多重M层代理传值

块语法Block在MVC思维的妙用之多重M层代理传值

坤小的专栏 4210

磁吸USB充电线原理与微型设备供电改造指南

磁吸USB充电线并非简单加装磁铁,而是面向微型电子设备(如TWS耳机、血糖仪、运动相机)的物理层供电升级方案。其核心在于分离‘定位’与‘导通’功能,通过多极阵列磁吸、金锡共镀触点和机械限位三重耦合,解决传统Micro-USB/Type-C接口因空间受限、单手操作难、高频插拔导致的接触不良、焊点虚连与接口磨损问题。技术价值体现在提升连接可靠性、延长设备接口寿命、降低用户操作门槛。适用于体积<8cm×4cm×2cm且充电口已出现松动或插拔困难的小型设备,是可穿戴、医疗及IoT终端供电生态的关键补缺。

weixin_33906657的博客 248

[iOS]-单例模式\通知\代理

iOS-单例、通知、代理总结

m0_52192682的博客 593

iOS - 通知 代理 KVO Block

文章目录NSNotification 通知delegate代理blockKVO对比KVO和NSNotification的对比delegate和NSNotification对比block和delegate对比观察者模式代理模式 NSNotification 通知 基本流程:controller使用name发送通知,持有与之相同name的另一方接收通知并进行处理(如果添加的观察者name为空,那么就会接收所有通知)。 NSNotification是iOS中一个调度消息通知的类,属于观察者模式的一种,在程序中

weixin_45841522的博客 508

OS笔记047代理传值和block传值

在两个不同的控制器之间传递数据,可以使用代理传值或者block传值。 例子是一个简单通讯录。 主界面如下: 添加联系人界面 查看/编辑联系人界面:默认是查看模式,点击编辑后进入编辑模式 编辑模式 数据更新成功。 其中添加联系人界面的数据传递使用代理方式实现。 编辑联系人界面的数据传递使用block实现。 下面来看具体过程 1、整个界面搭建 在...

weixin_30908649的博客 69

IOS笔记047-代理传值和block传值

在两个不同的控制器之间传递数据,可以使用代理传值或者block传值。 例子是一个简单通讯录。 主界面如下: 添加联系人界面 查看/编辑联系人界面:默认是查看模式,点击编辑后进入编辑模式 编辑模式 数据更新成功。 其中添加联系人界面的数据传递使用代理方式实现。 编辑联系人界面的数据传递使用block实现。 下面来看具体过程 1、整个界面搭建 在story...

weixin_30478757的博客 113

delegate、NSNotification、KVO、block

文章目录delegateNSNotificationKVOblock对比参考文献 在iOS开发中,经常会碰到传值的问题,我们通常有四种方法来解决: delegate 代理委托 NSNotification 通知 KVO 键值观察 block 闭包 分别来说说使用它们的场景: delegate 代理模式的基本使用流程是:一个controller定义了一个协议,协议里有若干个方法,一个对象如果想作为controller的delegate,就必须得实现这些方法,也就是controller委托另一个对象作为co

吃橘子 249

ios 给网页传值_IOS常用的页面传值方式

IOS项目开发中,经常需要在不同的控制器之间跳转时进行传值操作,传值方式按传递的方向分为正向传值和逆向传值,正向传值比较好理解,就比如A控制器Push跳转至B控制器时,在A控制器中获取到B控制器的实例化对象,对B控制器的属性进行赋值,当控制器完成跳转后,就完成了值的传递。而逆向传值是B控制器Pop到A控制器时,对A控制器的某个属性进行赋值,虽然在B控制器中可以获取到A控制器的实例化对象,但是不能像...

weixin_33362939的博客 198

cell上按钮的点击事件

.h@property (assign,nonatomic) SEL cancleBtnAction; @property (assign,nonatomic) id target; .m - (void)layoutSubviews { [super layoutSubviews]; [self.cancleBtn addTarget:self.target action:s

YY_Seven的专栏 1781
上一篇: Generic iOS Device 和连上iphone
下一篇: 静态包中info.plist打进去之后,上线打包ipa报错
有没有人告诉你
博客等级 码龄14年 132粉丝 314原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值