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);
在代码块中改变局部变量编译不通过。怎么在代码块中改变局部变量呢?在局部变量前面加上关键字:__block
__block int local = 500;
- void(^block)(void) = ^(void)
- {
- local++;
- NSLog(@"local:%d", local);
- };
- block();
- NSLog(@"local:%d", local);
运行结果:local:501
local:501
Block 块的更多相关文章
- iOS之block块
Block块. 1.声明Block int (^myBlock)(int n) = ^(int num) 类型 (^名称)(需要传的参数)= ^(参数) 2 __block 变量 在block块中修改 ...
- Linux内核系列之Block块层(一)
.Block块层入口函数为 genhd_device_init(),先对该函数开始分析: 函数实现源码: static int __init genhd_device_init(void) { ...
- 关于block块使用的6点注意事项
对于刚学习OC新伙伴,block块一直都是一个比较纠结.比较难懂的知识点,不过,在使用一段时间后,就会感觉很酸爽.block块的原理及使用我就不再赘述,网上有很多这方面的资料.我个人使用这么长时间以来 ...
- 定义block块
一: 工程图 二: 代码区 AppDelegate.h #import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <U ...
- Objective-C中的block块语法
#import <Foundation/Foundation.h> /* OC不同于Java C++ 它没有字符串对象 只有NS对象 NS就是乔布斯第一个公司NeXt的类集合 被收购之后才 ...
- 初探swift语言的学习笔记(闭包 - 匿名函数或block块代码)
很多高级语言都支持匿名函数操作,在OC中的block也为大家所熟悉,然面在swift里好像是被重新作了一个定义,不叫匿名函数,或 block了,而叫闭包(closure).下面配合代码来理解一下swi ...
- iOS开发之使用block块进行数据遍历的方法
看了一篇文章,发现遍历数组.字典中的数据时,除了使用for循环外,还可以使用block块进行操作,瞬间感觉iOS的语言代码确实有点高大上的感觉,下面就简单的介绍一下这个方法. 首先是最基本的运用形式, ...
- ARC中block块作为属性的使用笔记
ARC中block块作为属性的使用笔记 block较难理解,根据在内存中的分布情况就分为3种类型,根据使用的情形又分为很多很多种.虽然用起来容易,但使用不当会造成内存泄露,虽然都是这么说,但你真的研究 ...
- Linux_僵尸进程、挂载、block块、inode号
僵尸进程: 基本概念: 进程分为父进程和子进程 父进程一死 子进程都会死 杀死主进程的时候 子进程也会被杀死 僵尸进程:主进程被杀死了 但是子进程还活着 子进程不会占用cpu但还是会占着内存 ...
- hdfs深入:03、hdfs的架构以及副本机制和block块存储
HDFS分布式文件系统设计目标 1. 硬件错误 由于集群很多时候由数量众多的廉价机组成,使得硬件错误成为常态 2. 数据流访问 所有应用以流的方式访问数 ...
随机推荐
- hibernate进阶--一对多映射配置
hibernate作为一款优秀的ORM框架,广受大家喜爱,也被Java社区公认为持久层的首选.虽然jdbc为Java数据库操 作带来了诸多便利,但是并没有统一SQL语句的写法,而且具体操作数据库的代码 ...
- ASP.NET MVC4 学习系统五(Razor)
Razor ,你好! Razor 是一种把代码和内容进行平滑集成的语法.尽管它引入了一些新的符号和关键字,但是Razor并不是一种新的语法.相反,Razor允许用户使用已知的语言来编写代码 ...
- Avl树的基本操作(c语言实现)
#include<stdio.h> #include<stdlib.h> typedef struct AvlNode *Position; typedef struct Av ...
- 浅谈HTTPS安全性
各位可曾有过使用智能手机App在网络商店购物的经验,想必是有的,那你/妳会不会担心不够安全呢?有人会说放心吧,购物网站有使用SSL/TLS加密传输,我们就来聊聊HTTPS好了. 客户端与服务器端的交握 ...
- 分析器错误消息: 无法识别的属性“targetFramework”。请注意属性名称区分大小写。
转自:http://blog.sina.com.cn/s/blog_48964b12010157p0.html 配置错误说明: 在处理向该请求提供服务所需的配置文件时出错.请检查下面的特定错误详细信息 ...
- hdu2053
查找1-n中能整除n的数的个数. 如果是偶数的话,结果为0 奇数的话,结果为1 #include <stdio.h> int main(){ int i,cnt,n; while(~sca ...
- 如何循序渐进地学习Javascript
javascript入门太容易了,导致几乎人人随便看看就能上手,零基础的人学个三五天都能对外宣称自己掌握了js.可是真正掌握js是一件很难的事情.如果在初学一门语言的时候第一想到的是问别人,是很难取得 ...
- read 不回显的方法
方法就是: stty -echo #设置输入字符不回显 #此处用read语句接收用户输入的内容 stty echo #取消不回显状态 stty erase '^H'
- php header 函数详解
网页的缓存是由 HTTP消息头中的“Cache-control”来控制的,常见的取值有private.no-cache.max-age.must- revalidate等,默认为private.其作用 ...
- python网页请求urllib2模块简单封装代码
这篇文章主要分享一个python网页请求模块urllib2模块的简单封装代码. 原文转自:http://www.jbxue.com/article/16585.html 对python网页请求模块ur ...