Objective-C语法之代码块(block)的使用

代码块本质上是和其它变量相似。不同的是,代码块存储的数据是一个函数体。使用代码块是,你能够像调用其它标准函数一样,传入參数数,并得到返回值。

脱字符(^)是块的语法标记。依照我们熟悉的參数语法规约所定义的返回值以及块的主体(也就是能够执行的代码)。下图是怎样把块变量赋值给一个变量的语法解说:


依照调用函数的方式调用块对象变量就能够了:
int result = myBlock(4); // result是 28

1、參数是NSString*的代码块

        void (^printBlock)(NSString *x);printBlock = ^(NSString* str){NSLog(@"print:%@", str);};printBlock(@"hello world!");
执行结果是:print:hello world!

2、代码用在字符串数组排序

        NSArray *stringArray = [NSArray arrayWithObjects:@"abc 1", @"abc 21", @"abc 12",@"abc 13",@"abc 05",nil];NSComparator sortBlock = ^(id string1, id string2){return [string1 compare:string2];};NSArray *sortArray = [stringArray sortedArrayUsingComparator:sortBlock];NSLog(@"sortArray:%@", sortArray);
执行结果:sortArray:(

    "abc 05",

    "abc 1",

    "abc 12",

    "abc 13",

    "abc 21"

)

3、代码块的递归调用

代码块想要递归调用,代码块变量必须是全局变量或者是静态变量,这样在程序启动的时候代码块变量就初始化了,能够递归调用

        static void (^ const blocks)(int) = ^(int i){if (i > 0) {NSLog(@"num:%d", i);blocks(i - 1);}};blocks(3);
执行打印结果:

num:3

num:2

num:1

 4、在代码块中使用局部变量和全局变量

在代码块中能够使用和改变全局变量

int global = 1000;
int main(int argc, const char * argv[])
{@autoreleasepool {void(^block)(void) = ^(void){global++;NSLog(@"global:%d", global);};block();NSLog(@"global:%d", global);}return 0;
}

执行打印结果:

global:1001

global:1001

而局部变量能够使用,可是不能改变。

        int local = 500;void(^block)(void) = ^(void){
//            local++;NSLog(@"local:%d", local);};block();NSLog(@"local:%d", local);
在代码块中改变局部变量编译不通过。怎么在代码块中改变局部变量呢?在局部变量前面加上keyword:__block

        __block int local = 500;void(^block)(void) = ^(void){local++;NSLog(@"local:%d", local);};block();NSLog(@"local:%d", local);
执行结果:local:501

                    local:501

著作权声明:本文由http://blog.csdn.net/totogo2010/原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!




转载于:https://www.cnblogs.com/mfrbuaa/p/3942224.html

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

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

相关文章

C#委托和事件

http://www.cnblogs.com/leslies2/archive/2012/03/22/2389318.html 讲解比较好 转载于:https://www.cnblogs.com/sun-shadow/p/4872768.html

asp.net mvc使用mysql_ASP.NET开发实战——(八)ASP.NET MVC 与数据库之MySQL

之前介绍了My Blog如何使用http://ADO.NET来访问SQL Server获取数据。本章将介绍如何使用My SQL来完成数据管理。在使用My SQL之前需确保开发环境中安装了My SQL数据库和Connector/Net,后者是一个用C#编写的http://ADO.NET数据提供器,换句话说无论使用SQ…

多元时代个人信息更需强有力保护

有网友反映,用多个搜索引擎搜索“手持身份证照片”,皆出现大量相关图片,人脸清晰,身份证号码等关键信息明白无误。不少网友担心“这么重要的信息就这么暴露,太危险”。记者发现,其中有弱势群体求助信息&…

修改Eclipse自动换行长度

使用CtrlShiftF自动格式化代码的时候,有时候折行太多反而让代码看起来更乱,不容易阅读。 解决办法: Window-->Preferences-->Java-->Code Style-->Formatter-->Edit-->Line Wrapping-->Maximum line width根据需要设置&…

卓越管理的实践技巧(1)如何进行有效的指导 Guidelines for Effective Coaching

Guidelines for Effective Coaching 前文卓越管理的秘密(Behind Closed Doors)最后一部分提到了总结的13条卓越管理的实践技巧并列出了所有实践技巧名称的索引,这篇文章主要写卓越管理的实践技巧的第(1)条:…

Java Web应用的生命周期

Java Web应用的生命周期。三个阶段:启动,运行,终止。  无论是web还是servlet他们的生命周期都是有容器来控制的。  启动:  1. 把web.xm 加载到内存中  2. 为web应用创建一个ServletContext对象  3. 对所有的Filter进行初…

count返回0_你是一直认为 count(1) 比 count(*) 效率高么?

MySQL count(1) 真的比 count(*) 快么? 反正同事们都是这么说的,我也姑且觉得对吧,那么没有自己研究一下究竟?如果我告诉你他们一样,你信么?有 Where 条件的 count,会根据扫码结果count 一下所有的行数&am…

13点建议顺利通过JAVA面试【转载】

原文:http://www.javamm.com/?p7274 找到一份高薪的java工作,从程序员走向高级程序员、架构师、分析员,是所有java程序员们的追求。 找一份好工作,自然要看工作经历、项目积累、综合能力。但是,在繁忙、琐碎的日常工作…

微软过冬的三大姿势:裁员,回购400亿美元股票,在中国开合资公司

近期没什么大新闻的微软,现在有了。 回购400亿美元股票,给股东发“红包” 先看一条开心的。根据外媒BusinessInsider的报道,微软日前发表声明称,董事会已经批准了一项价值上限达400亿美元的新股票回购计划,此次回购计划…

获取进程CPU占用率

获取进程CPU占用率 // 时间转换 static __int64 file_time_2_utc(const FILETIME* ftime) {LARGE_INTEGER li;li.LowPart ftime->dwLowDateTime;li.HighPart ftime->dwHighDateTime;return li.QuadPart; }// 获得CPU的核数 static int get_processor_number() {SYSTEM_…

dbeaver连接mysql失败_关于DBeaver连接MySQL数据库遇到的版本问题解决

在使用DBeaver连接MySQL数据库时,明明按照它提示进行jar包的下载,但是仍然报错,提示版本问题,那么这个时候我们要解决的就是MySQL版本对应驱动包的问题。笔者经过测试后有了一些心得,放上来希望对大家能够有所参考。首…

巴伦周刊:“物联网”正走向死胡同

作为当今科技界最流行的热门术语之一,“物联网”实际上是个使用不当的称呼,而对于科技界来说这是个大问题。顾名思义,“物联网”是由大量设备组成,比如智能家居设备制造商Nest的家用恒温器、苹果公司智能手表Apple Watch以及健身设…

【WIN10】VisualStateManager使用說明

Demo下載:http://yunpan.cn/cFjgPtWRHKH9H 访问密码 c4b7 顧名思義,視圖狀態管理器。 在WPF中,它的功能似乎更強大。在UWP中,閹割了GotElementState方法,導致它只能在控件內部使用。 這個東東一般用來突出某些操作&am…

mysql against包含英文_在MySQL中使用MATCH和AGAINST选择特定列中包含字符串的行

让我们首先创建一个表-mysql> create table DemoTable1833(Name varchar(20));修改表-Mysql> alter table DemoTable1833 ADD FULLTEXT(Name);Records: 0 Duplicates: 0 Warnings: 1使用插入命令在表中插入一些记录-mysql> insert into DemoTable1833 values(John D…

Hadoop伪分布配置与基于Eclipse开发环境搭建

国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私募机构九鼎控股打造,九鼎投资是在全国股份…

百度地图JavaScript API覆盖物旋转时出现偏移

在项目中&#xff0c;调用百度地图JavaScript API&#xff0c;做覆盖物的旋转再添加到地图上&#xff0c;结果出现偏移了。 调试过程中的效果图&#xff1a; 发现图片的旋转并不是按车子的中心来的&#xff0c;而是之外的一个点。最后发现犯了一个很细节的错&#xff1a; <s…

英利1500伏光伏组件系列亮相美国

2016年4月21日&#xff0c;英利宣布其公用事业规模太阳能光伏生产线YGE-U1500系列亮相美国。 近日&#xff0c;美国保险商实验室&#xff08;UL&#xff09;对新型光伏板系列进行认证&#xff0c;可用于最大系统电压为1500伏的项目。 部署英利多晶硅YGE-U 1500光伏组件系列可为…

eclipse 关闭时progress information弹框_Spring开发环境搭建(Eclipse)

开发环境搭建&#xff0c;主要包含2部分:Java安装Eclipse安装为易于学习&#xff0c;我们只安装这2个部分&#xff0c;对于一般开发学习也足够了。如果你有其他要安装的&#xff0c;酌情添加。Java安装我们使用Java8&#xff1a;下载JDK32位下载x86版本&#xff0c;64位下载x64…

紫薯铜锣烧

材料&#xff1a; 全麦粉 三勺 鸡蛋 一只 毅力低脂纯牛奶 半盒 紫薯 蜂蜜 一勺 做法&#xff1a; 1. 鸡蛋打开&#xff0c;加入半盒牛奶&#xff0c;分三次加入三勺全麦面粉&#xff0c;每次加入都要上下搅拌&#xff0c;面粉要过筛&#xff0c;最后加入半勺蜂蜜 2.紫薯蒸熟压…

共享单车,信息安全应未雨绸缪

前日&#xff0c;摩拜单车首现泉州&#xff0c;一时间泉州的共享单车市场呈现出“三国杀”局面。据了解&#xff0c;目前三个平台收取的押金金额每人在199元至300元不等&#xff0c;且都约定押金可原路退还&#xff0c;但积沙成塔&#xff0c;成千上万用户缴纳的押金就相当可观…