【OC】块初识

news/2024/4/20 12:23:09/文章来源:https://blog.csdn.net/m0_63852285/article/details/129000134

Block简介

Blocks是C语言的扩充功能。可以用一句话来表示Blocks的扩充功能:带有自动变量的匿名函数。

匿名函数

所谓匿名函数就是不带有名称的函数。C语言的标准不允许存在这样的函数。例:

int func(int count);

它声明了名称为func的函数。下面的源代码中为了调用该函数,必须使用该函数的名称func。

int result = func(10);

但其实使用函数指针也仍需要知道函数名称。像以下源代码这样,在赋值函数指针时,若不使用想复制的函数的名称,就无法取得该函数的地址。

int (*funcptr)(int) = &func;
int result = (*funcptr)(10);

而通过Blocks,源代码中就能够使用匿名函数。

自动变量

首先回顾一下在C语言的函数中可能使用的变量。

  • 自动变量(局部变量)
  • 函数的参数
  • 静态变量(静态局部变量)
  • 静态全局变量
  • 全局变量

其中,在函数的多次调用之间能够传递的变量有:

  • 静态变量(静态局部变量)
  • 静态全局变量
  • 全局变量

虽然这些变量的作用域不同,但在整个程序当中,一个变量总保持在一个内存区域。因此,虽然多次调用函数,但改变量值总能保持不变,在任何时候以任何状态调用,使用的都是同样的变量值。

int buttonId = 0;
void buttonCallblack(int event) {printf("buttonId:%d event=%d\n", buttonId, event);
}

如果只有一个按钮,那么该代码毫无问题,可正常运行。但有多个按钮时会如何呢?

int buttonId;void buttonCallBack(int event) {printf("buttonId:%d event=%d\n", buttonId, event);
}void setButtonCallbacks() {for (int i = 0, i < BUTTON_MAX; ++i) {buttonId = i;setButtonCallback(BUTTON_IDOFFSET + i, &buttonCallback);}  
}

该源代码到的问题很明显。全局变量buttonId只有一个,所有回调都使用for循环最后的值。

如果不使用全局变量,回调方会将按钮的ID作为函数参数传递,就能解决该问题。

void buttonCallback(int buttonId, int event) {printf("buttonId:%d event=%d\n", buttonId, event);
}

但是,回调方在保持回调函数的指针以外,还必须保持回调方的按钮ID。

C++和Objective-C使用类可保持变量值且能够多次持有该变量自身。它会声明持有成员变量的类,由类生成的实例或对象保持该成员变量的值。

我们可以来思考一下刚才例子中用来回调按钮的类。

@interface ButtonCallbackobject : NSObject
{int buttonId_;
}
@end@implementation ButtonCallbackObject
- (id) initWithButtonId:(int)buttonId
{self = [super init];buttonId_ = buttonId;return self;
}- (void) callback:(int)event
{NSLog(@"buttonId:%d event=%d\n", buttonId_, event);
}
@end

如果使用该类,由于对象保持按钮ID,因此回调方只需要保持对象即可。可如下使用:

void setButtonCallbacks() {for (int I = 0; I < BUTTON+MAX; ++I) {ButtonCallbackObject *callbackObj = [[ButtonCallbackObject alloc] initWithButtonId:I];setButtonCallbackUsingObject(BUTTON_IDOFFSET, callbackObj);}
}

缺点:增加代码长度。

Blocks

这时我们就要用到Blocks了。Blocks提供了类似由C++和Objective-C类生成实例或对象来保持变量值的方法,其代码量与编译C语言函数差不多。如“带有自动变量值”,Blocks保持自动变量的值。下面我们使用Blocks实现上面的按钮回调:

void setButtonCallbacks()
{for (int I = 0; I < BUTTON_MAX; ++I) {setButtonCallbackUsingBlock(BUTTON_IDOFFSET + I, ^(int event) {printf("buttonID:%d event=%d\n", I, event);});}
}

该源代码将“带有自动变量i值的匿名函数”设定为按钮的回调。Blocks中将该匿名函数部分称为“Block literal”,或简称为“Block”。

像这样,使用Blocks可以不声明C++和Objective-C类,也没有使用静态变量、静态全局变量或全局变量时的问题。

Block在其他程序语言中的名称

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_74253.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++---线性dp---传纸条(每日一道算法2023.2.26)

注意事项&#xff1a; 本题dp思路与 “线性dp–方格取数” 一致&#xff0c;下方思路仅证明为什么使用方格取数的思路是正确的。 题目&#xff1a; 小渊和小轩是好朋友也是同班同学&#xff0c;他们在一起总有谈不完的话题。 一次素质拓展活动中&#xff0c;班上同学安排坐成…

3.7寸按键翻页工牌

产品参数 产品型号 ESL_BWR3.7_BLE 产品尺寸 (mm) 62.51066.5 显示技术 E ink 显示区域 (mm) 47.32(H)81.12(V) 分辨率 (像素) 280480 像素尺寸(mm) 0.1690.169 150dpi 显示颜色 黑/白 视觉角度 180 工作温度 0℃ - 50℃ 电池 500mAh ( Type-C 充电…

Overleaf推广奖励:增加合作者的数量、解锁Dropbox同步和项目修改历史

Overleaf推广奖励 Overleaf是一个LaTeX\LaTeXLATE​X在线编译器&#xff0c;它可以让你与合作者共同在线编辑文档。但是默认的免费账号仅能邀请一个合作者。那么如何增加合作者的数量呢&#xff1f; Overleaf推出了一个奖励计划&#xff0c;你邀请其他人注册Overleaf&#xf…

java地图导出——添加经纬线

概述 前面的文章Node实现切片的拼接和地图的导出和Java实现地图的导出分别讲述可如何在node和java中实现切片的拼接以及地图的导出。本文&#xff0c;书接前文&#xff0c;实现java导出时经纬度的添加。 实现后效果 实现 完整的实现思路流程如下图&#xff1a; 1. 根据切片…

数据挖掘概述

目录1、数据挖掘概述2、数据挖掘常用库3、模型介绍3.1 分类3.2 聚类3.3 回归3.4 关联3.5 模型集成4、模型评估ROC 曲线5、模型应用1、数据挖掘概述 数据挖掘&#xff1a;寻找数据中隐含的知识并用于产生商业价值 数据挖掘产生原因&#xff1a;海量数据、维度众多、问题复杂 数…

macOS使用CodeRunner快速配置fortran环境

个人网站:xzajyjs.cn 由于一些项目的缘故&#xff0c;需要有fortran的需求&#xff0c;但由于是M1 mac的缘故&#xff0c;不能像windows那样直接使用vsivf这种经典配置。搜了一下网上主流的跨平台方案&#xff0c;主要是gfortran&#xff0c;最近用Coderunner&#xff08;主要…

MyBatis——增删改查操作的实现

开启mybatis sql日志打印 可以在日志中看到sql中执行的语句 在配置文件中加上下面这几条语句 mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl logging.level.com.example.demodebug查询操作 根据用户id查询用户 UserMapper&#xff1a; User…

Elasticsearch7.8.0版本进阶——自定义分析器

目录一、自定义分析器的概述二、自定义的分析器的测试示例一、自定义分析器的概述 Elasticsearch 带有一些现成的分析器&#xff0c;然而在分析器上 Elasticsearch 真正的强大之 处在于&#xff0c;你可以通过在一个适合你的特定数据的设置之中组合字符过滤器、分词器、词汇单 …

Lighthouse组合Puppeteer检测页面

如上一篇文章lighthouse的介绍和基本使用方法结尾提到的一样&#xff0c;我们在实际使用Lighthouse检测页面性能时&#xff0c;通常需要一定的业务前置条件&#xff0c;比如最常见的登录操作、如果没有登录态就没有办法访问其他页面。再比如有一些页面是需要进行一系列的操作&a…

傻瓜式minio使用指南

傻瓜式minio使用指南1. docker部署minio1.1 docker拉取minio镜像1.2 创建docker容器1.3 查看docker容器是否启动正常2.登陆minio2.1 账户、密码为原先设置minioadmin2.2 创建桶2.3 设置桶属性3.Java客户端使用3.1引入依赖3.2 使用3.3 结果1. docker部署minio 1.1 docker拉取mi…

C语言几种判断语句简述

C 判断 判断结构要求程序员指定一个或多个要评估或测试的条件&#xff0c;以及条件为真时要执行的语句&#xff08;必需的&#xff09;和条件为假时要执行的语句&#xff08;可选的&#xff09;。 C 语言把任何非零和非空的值假定为 true&#xff0c;把零或 null 假定为 fals…

Linux系统下搭建maven环境

文章目录前述从官网下载安装包安装 maven修改maven配置修改环境变量测试前述 安装 maven 环境前&#xff0c;需要先安装 java 环境&#xff0c;如果没有安装 java 环境&#xff0c;可以参考&#xff1a;https://blog.csdn.net/weixin_45583303/article/details/118631855 从官…

【力扣周赛#334】6369. 左右元素和的差值 + 6368. 找出字符串的可整除数组 + 6367. 求出最多标记下标

目录 6369. 左右元素和的差值 - 前缀后缀和 ac 6368. 找出字符串的可整除数组 - 操作余数ac 6367. 求出最多标记下标 - 二分答案 贪心 6369. 左右元素和的差值 - 前缀后缀和 ac class Solution {public int[] leftRigthDifference(int[] nums) {int nnums.length;int[] re…

【JavaWeb】复习重点内容

✅✅作者主页&#xff1a;&#x1f517;孙不坚1208的博客 &#x1f525;&#x1f525;精选专栏&#xff1a;&#x1f517;JavaWeb从入门到精通&#xff08;持续更新中&#xff09; &#x1f4cb;&#x1f4cb; 本文摘要&#xff1a;本篇文章主要分享JavaWeb的学习重点内容。 &a…

QT之OpenGL混合

QT之OpenGL混合1. 概述2. 实现2.1 丢弃片段2.1.1 Demo2.2 混合2.2.1 相关函数2.2.2 排序问题2.2.3 Demo1. 概述 OpenGL中&#xff0c;混合(Blending)通常是实现物体透明度(Transparency)的一种技术。 2. 实现 2.1 丢弃片段 在某些情况下&#xff0c;有些片段是只需要设置显…

ecology9-谷歌浏览器下-pdf.js在渲染时部分发票丢失文字 问题定位及解决

问题 问题描述 &#xff1a; 在谷歌浏览器下&#xff0c;pdf.js在渲染时部分发票丢失文字&#xff1b;360浏览器兼容模式不存在此问题 排查思路&#xff1a;1、对比谷歌浏览器的css样式和360浏览器兼容模式下的样式&#xff0c;没有发现关键差别 2、✔使用Fiddler修改网页js D…

SAP MM学习笔记1-SAP中扩张的概念,如何将一个物料从工厂A扩张到工厂B

MM中在创建物料的时候&#xff0c;最低也得创建如下5个view。 基本数据1 基本数据2 购买管理 会计1 会计2 1&#xff0c;扩张是什么 有时候&#xff0c;你想增加其他的View&#xff0c;比如保管场所 等&#xff0c;你不能用MM02来做编辑&#xff0c;要用MM01来做扩张。这就是扩…

【Linux】工具(2)——vim

本期博客我们进入到Linux环境下vim工具的学习&#xff1a;一、vim是什么&#x1f4cc;Vim是一个超级超级强大的文本编辑器。Vim及前身VI&#xff0c;历史悠久&#xff08;可能比多数读者的年龄更大&#xff09;&#xff0c;经历了几十年的考验和发展。Vim全称叫Vi IMproved. 而…

聚类算法(上):8个常见的无监督聚类方法介绍和比较

无监督聚类方法的评价指标必须依赖于数据和聚类结果的内在属性&#xff0c;例如聚类的紧凑性和分离性&#xff0c;与外部知识的一致性&#xff0c;以及同一算法不同运行结果的稳定性。 本文将全面概述Scikit-Learn库中用于的聚类技术以及各种评估方法。 本文将分为2个部分&…

LearnOpenGL-入门-纹理

本人刚学OpenGL不久且自学&#xff0c;文中定有代码、术语等错误&#xff0c;欢迎指正 我写的项目地址&#xff1a;https://github.com/liujianjie/LearnOpenGLProject LearnOpenGL中文官网&#xff1a;https://learnopengl-cn.github.io/ 文章目录纹理纹理环绕方式纹理过滤多…