*本文参考了《Objective-C高级编程 iOS与OSX多线程和内存管理》一书,关于Block的介绍摘取自此书。

Objective-c 语言中Block语法格式为:

返回值类型  参数列表  表达式

c语言中的函数语法格式为

返回值类型  函数方法名  参数列表   表达式

从上面的语法可以看出,完整的Block与一般C语言函数定义相比,仅有两点不同:

(1)没有函数名

(2)带有"^”符号

以下是一个完整的Block示例:

^int (int count){return count + 1;}

在使用时Block,可以省略返回值类型,省略返回值类型时,如果表达式中又return语句,就自动使用该返回值的类型,如果没有return语句,就自动使用了void类型。表达式中含有多个return语句时,所有return的返回值必须相同,上面代码可以写成:

^(int count){return count + 1;}

另外,如果Block不带参数,则参数列表也可省略,如:

^void (void){printf("Blocks\n");}

可以写成

^{printf("Blocks\n");}

2.block类型变量

在Block语法下,可将Block语法赋值给声明为Block类型的变量中,声明Block类型变量的示例如下:

int (^blk)(int);

使用Block语法将Block赋值为Block类型的变量:

int (^blk)(int) = ^(int count){return count+1;};

因为Block类型的变量与通常的变量相同,所以也可以将Block类型变量赋值给Block类型变量:

int (^blk1)(int) = blk

也可以:

int (^blk2)(int);
blk2 = blk1;

在函数参数中使用Block类型变量可以向函数传递Block

void func(int (^blk)(int)){}

另外,可以使用typedef来简化代码,如通过typedef声明blk_t类型变量:

typedef int (^blk_t)(int);

实例:封装一个通用的网络请求函数(action为请求的方法名,parmeters为参数,请求成功获得到json数据)

伪代码如下:

typedef void(^ Failure)();
typedef void(^Success)(NSDictionary *dic);
#pragma mark - 网络操作
- (void)createAsynchronousRequest:(NSString *)action parmeters:(NSDictionary *)parmeters success:(Success)success failure:(Failure)failure {if(请求成功)success(responseObject);else{failure();}
}

使用方法如下:

[self createAsynchronousRequest:LogInAction parmeters:parameters success:^(NSDictionary *dic){//请求成功后在这里处理} failure:^{//请求失败后在这里处理}];

iOS 关于Blocks相关推荐

  1. iOS开发 Block的用法

    一:在ios,blocks是对象,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值.它和传统的函数指针很类似,但是有区别:b ...

  2. afn原理 ios_afn原理

    转载http://www.th7.cn/Program/IOS/201503/405717.shtml 1    类库功能简介 1.1  AFNetworking的大体思路 1.1.1 NSURLCo ...

  3. IOS Blocks 详细介绍

    block类似与函数指针,与函数指针的区别在于其可以捕获(capture)其定义时作用域内的变量,当在其他位置调用时仍然可以使用. block是一种Objective-C对象,其数据结构中存在isa指 ...

  4. iOS Technical Support For Bloxorz Blocks 3D

    App Technical Support  Email:394175992@qq.com  QQ:394175992

  5. 使最新版Code::Blocks支持C++11标准

    在使用最新版的Code::Blocks的时候发现如果使用C++11的unordered_map编译器就会报错: error: 'unordered_map' does not name a type ...

  6. Delphi xe7 FireMonkey / Mobile (Android, iOS)生成 QR Code完整实例

    这个实例在windows.OS X.IOS和Android等平台运行正常. 本文参考这个网站提供的方法:http://zarko-gajic.iz.hr/firemonkey-mobile-andro ...

  7. iOS 消息的传递机制

    2019独角兽企业重金招聘Python工程师标准>>> 转载原地址:http://beyondvincent.com/blog/2013/12/14/124-communicatio ...

  8. iOS 开发中的多线程

    线程.进程 什么是线程.进程   有的人说进程就像是人的脑袋,线程就是脑袋上的头发~~.其实这么比方不算错,但是更简单的来说,用迅雷下载文件,迅雷这个程序就是一个进程,下载的文件就是一个线程,同时下载 ...

  9. 【图灵】iOS技能书单——入门+进阶+精通

    小编最近在研究一份不错的技能图谱(https://github.com/TeamStuQ/skill-map),遵照图谱精神,小编先做了个iOS技能书单,分享给大家. 老样子,点击书名查看完整目录和试 ...

最新文章

  1. 云梦天气预报软件测试,云梦天气预报15天
  2. 计算机语言import,python中import指的是什么意思
  3. linux的常用操作——open函数
  4. python3 dict 排序_Python 3.9 新增功能展望
  5. 如何在C/C++中动态分配二维数组
  6. Node.js:使用session存储用户信息
  7. DIV+CSS布局 - 弹性盒子布局
  8. 中建政研马海顺-PPP项目EPC工程总承包全过程管控与风险防范
  9. IRQL深入解析--IRQL级别
  10. Frefox安装AeroFox皮肤插件后菜单字体的美化
  11. 程序员该怎么创业才比较靠谱?
  12. oracle优化器analyzed,Oracle Optimizer:迁移到使用基于成本的优化器—–系列1.2-数据库专栏,ORACLE...
  13. ROS--Kinetic--执行roslaunch时遇到的问题和解决办法
  14. win10笔记本插上耳机没声音设置
  15. 实验十 文件读写 1. 文件排版(文本文件读写)
  16. python38_python 并发编程
  17. 电脑重装系统-利用PE系统盘安装
  18. 利用wine使用msoffice软件
  19. 常用的SQL*Plus命令
  20. 全排列-python递归解法

热门文章

  1. 菜单样式1:鼠标悬停向下弹出列表
  2. JavaSE--jdom解析之bom
  3. 微软在.NET官网上线.NET 架构指南频道
  4. [UT]Unit Test理解
  5. activity 的属性android:taskAffinity和android:allowTaskReparenting
  6. 使用 git 管理 portage tree
  7. SAXParserFactory之求解
  8. [导入]如何理解Return的返回值?
  9. IDEA函数调用关系图插件
  10. 防止SQL注入式攻击