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

脱字符(^)是块的语法标记。按照我们熟悉的参数语法规约所定义的返回值以及块的主体(也就是可以执行的代码)。下图是如何把块变量赋值给一个变量的语法讲解:

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

1、参数是NSString*的代码块

  1. void (^printBlock)(NSString *x);
  2. printBlock = ^(NSString* str)
  3. {
  4. NSLog(@"print:%@", str);
  5. };
  6. printBlock(@"hello world!");

运行结果是:print:hello world!

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

  1. NSArray *stringArray = [NSArray arrayWithObjects:@"abc 1", @"abc 21", @"abc 12",@"abc 13",@"abc 05",nil];
  2. NSComparator sortBlock = ^(id string1, id string2)
  3. {
  4. return [string1 compare:string2];
  5. };
  6. NSArray *sortArray = [stringArray sortedArrayUsingComparator:sortBlock];
  7. NSLog(@"sortArray:%@", sortArray);

运行结果:sortArray:(

    "abc 05",

    "abc 1",

    "abc 12",

    "abc 13",

    "abc 21"

)

3、代码块的递归调用

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

  1. static void (^ const blocks)(int) = ^(int i)
  2. {
  3. if (i > 0) {
  4. NSLog(@"num:%d", i);
  5. blocks(i - 1);
  6. }
  7. };
  8. blocks(3);

运行打印结果:

num:3

num:2

num:1

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

在代码块中可以使用和改变全局变量

  1. int global = 1000;
  2. int main(int argc, const char * argv[])
  3. {
  4. @autoreleasepool {
  5. void(^block)(void) = ^(void)
  6. {
  7. global++;
  8. NSLog(@"global:%d", global);
  9. };
  10. block();
  11. NSLog(@"global:%d", global);
  12. }
  13. return 0;
  14. }

运行打印结果:

global:1001

global:1001

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

  1. int local = 500;
  2. void(^block)(void) = ^(void)
  3. {
  4. local++;
  5. NSLog(@"local:%d", local);
  6. };
  7. block();
  8. NSLog(@"local:%d", local);

在代码块中改变局部变量编译不通过。怎么在代码块中改变局部变量呢?在局部变量前面加上关键字:__block

  1. __block int local = 500;
  2. void(^block)(void) = ^(void)
  3. {
  4. local++;
  5. NSLog(@"local:%d", local);
  6. };
  7. block();
  8. NSLog(@"local:%d", local);

运行结果:local:501

                    local:501

Objective-C语法之代码块(block)的使用 (转载)的更多相关文章

  1. 初学Objective - C语法之代码块(block)

    一.block声明 1.无参数,无返回值: void (^sayHi)(); 2.有参数,有返回值: NSInteger (^operateOfValue)(NSInteger num); block ...

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

    代码块本质上是和其它变量相似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你能够像调用其它标准函数一样,传入參数数,并得到返回值. 脱字符(^)是块的语法标记.依照我们熟悉的參数语法规约所定 ...

  3. 代码块(block)的使用

    Objective-C语法之代码块(block)的使用 代码块本质上是和其他变量类似.不同的是,代码块存储的数据是一个函数体.使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值. 脱 ...

  4. 从C#到Objective-C,循序渐进学习苹果开发(4)--代码块(block)和错误异常处理的理解

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本文继续上一篇随笔<从 ...

  5. Objective-C-----协议protocol,代码块block,分类category

    概述 ObjC的语法主要基于smalltalk进行设计的,除了提供常规的面向对象特性外,还增加了很多其他特性,本文将重点介绍objective-C中一些常用的语法特性. 当然这些内容虽然和其他高级语言 ...

  6. 04OC之分类Category,协议Protocol,Copy,代码块block

    一.Protocol协议 我们都知道,在C#有个规范称之为接口,就是规范一系列的行为,事物.在C#中是使用Interface关键字来声明一个接口的,但是在OC中interface是用来声明类,所以用了 ...

  7. [转]iOS代码块Block

    代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量.作为参数.作为返回值,特殊地,Block还可以保存一段代码,在需要 ...

  8. iOS学习之代码块(Block)

    代码块(Block) (1)主要作用:将一段代码保存起来,在需要的地方调用即可. (2)全局变量在代码块中的使用: 全局变量可以在代码块中使用,同时也可以被改变,代码片段如下: ;//注意:全局变量 ...

  9. 一篇文章看懂iOS代码块Block

    block.png iOS代码块Block 概述 代码块Block是苹果在iOS4开始引入的对C语言的扩展,用来实现匿名函数的特性,Block是一种特殊的数据类型,其可以正常定义变量.作为参数.作为返 ...

随机推荐

  1. maven project 报错解决方法

    1 maven 在添加包后出错,project 处有红线的解决办法 Maven默认会使用本地缓存的库来编译工程,对于上次下载失败的库,maven会在~/.m2/repository/<group ...

  2. Windows下使用mklink命令参数介绍

    Windows下创建符号链接使用命令mklink常用参数有 /D /J,两者有比较明显的区别 区别1:创建/D 创建目录符号链接(即目录快捷方式)而不是文件符号链接(默认为文件符号链接),可以使用相对 ...

  3. docker 命令集

    1.提交本地镜像到远程cd to dockerfile directorysudo docker build -t orange5 ./sudo docker psdocker tag 1adec2c ...

  4. window10下TensorFlow-gpu环境搭建

    安装python 下载python3.5.4 https://www.python.org/downloads/release/python-354/ 选择Windows x86-64 executa ...

  5. 什么是面向切面编程AOP--知识点汇总

           最近在学这方面的内容,读到的这段话我感觉说的很清楚了:这种在运行时,动态地将代码切入到类的指定方法.指定位置上的编程思想就是面向切面的编程. 面向切面编程(AOP是Aspect Orie ...

  6. OpenCV + python 实现人脸检测(基于照片和视频进行检测)

    OpenCV + python 实现人脸检测(基于照片和视频进行检测) Haar-like 通俗的来讲,就是作为人脸特征即可. Haar特征值反映了图像的灰度变化情况.例如:脸部的一些特征能由矩形特征 ...

  7. rabbitmq web管理

    celery突然连接不上rabbitmq server,结果找半天发现是rabbitmq卡的不行... rabbitmq 设置web管理,添加用户 rabbitmqctl list_queues | ...

  8. SVN常用命令说明

    本文转载至  http://www.blogjava.net/jasmine214--love/archive/2011/01/12/342839.html :1.5 及更新版本 名词说明: WC:W ...

  9. 关于4A网络安全管控平台控件加载失败的解决方法

    最近电脑重装系统后,到公司登录4A管控平台提示"控件加载失败","无效的参数为:Null","点击资源无任何反映"等等问题 别人的电脑用的好 ...

  10. [LeetCode] Longest Substring Without Repeating Characters 最长无重复字符的子串

    Given a string, find the length of the longest substring without repeating characters. Example 1: In ...