第十讲:Obj-C Blocks 应用
转:http://tigercat1977.blog.163.com/blog/static/2141561122012111295955891/
第十讲:Obj-C Blocks 应用
2012-12-12 09:59:55| 分类: Objective-C | 标签:objective-c |字号大中小 订阅
Blocks 是什么
Blocks 和 C 语言函数指针区别
如何调用 Blocks
代理两端如何通过 Blocks 通讯
什么是 Blocks
Blocks 是一个 C Level 的语法以及运行时的一个特性,和标准 C 中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从 IOS 4.0 开始就很好的支持 Block。
![](http://img3.ph.126.net/fQXRUHzy-wWoqz-MZwMfCA==/6597185215378927333.jpg)
Blicks typedef 定义
C语言函数指针 typedef
typedef int (*SumBlockT)(int a, int b);
Block typedef 定义
typedef int (^SumBlockT)(int a, int b);
__block 关键字
一个Block 的内部是可以引用自身作用域外的变量的,包括 static 变量,extern 变量或自由变量 ( 定义一个变量的时候,如果不加存储修饰符,默认情况下就是自由变量 auto , auto 变量保存在 stack 中的, 除了 auto 之外还存在 register , static 等存储修饰符 ), 对于自由变量,在 Block 中是只读的。在引入 block 的同时,还引入了一种特殊的 __block 关键字变量存储修饰符
Blocks 简单用法举例
// main.m
#import <Foundation/Foundation.h> // 定义 Blocks 的 typedef typedef int (^SumBlockT) (int a, int b); int main (int argc, const char * argv[]) { @autoreleasepool { NSLog(@"Hello, World!"); void (^myblocks) (void) = NULL; myblocks = ^(void){ NSLog(@"in blocks"); }; // 给 myblocks 赋值 NSLog(@"before myblocks"); myblocks(); // 执行 myblocks; NSLog(@"after myblocks"); /* 输出结果: Hello, World! before myblocks in blocks after myblocks */ int (^myblock2) (int a, int b) = ^(int a, int b){ int c = a + b; return c; }; NSLog(@"before block2"); int ret = myblock2(10,20); NSLog(@"after block2 ret %d", ret); /* 输出结果: before block2 after block2 ret 30 */ __block int sum = 0; // 调用外部变量 需要使用 __block 存储修饰符 int (^myblocks3) (int a, int b) = ^(int a, int b){ sum = a+b; return 3; }; myblocks3(20, 30); NSLog(@"sum is %d", sum); /* 输出结果: sum is 50 */ // 前面定义 Blocks 的 typedef SumBlockT SumBlockT myblocks4 = ^(int a, int b){ NSLog(@"c is %d", a+b); return 0; }; myblocks4(50, 20); /* 输出结果: c is 70 */ } return 0; }
Blocks 案例
![](http://img5.ph.126.net/bvVhb0_VAV1YHlyVNu0ifw==/6597660204400858125.jpg)
转载于:https://www.cnblogs.com/jackljf/archive/2013/03/07/3589247.html
第十讲:Obj-C Blocks 应用相关推荐
- 计算机基础知识第十讲,计算机文化基础(第十讲)学习笔记
计算机文化基础(第十讲)学习笔记 采样和量化PictureElement Pixel(像素)(链接: 采样的实质就是要用多少点(这个点我们叫像素)来描述一张图像,比如,一幅420x570的图像,就表示 ...
- 《突破C#编程实例五十讲》源文件下载(2)
上接<<突破C#编程实例五十讲>源文件下载(1)> 有兴趣的朋友下载看看吧,一共有9个压缩包分3篇文章,下载要注意哦,不然解压要出错哦! 转载于:https://blog.51 ...
- 趣谈网络协议笔记-二(第十讲)
趣谈网络协议笔记-二(第十讲) UDP协议:因性善而简单,难免碰到"城会玩" 自勉 如果手上没有剑,我就无法保护你.如果我一直握着剑,我就无法抱紧你.--<Bleach> ...
- JSP快速入门教程——全十讲
第一讲(参考<Java Web程序设计基础教程>第1章) 1 JSP 和 Java的关系 一般Java指的标注版 Java SE 另外两个版本:Java EE 和 Java ME J ...
- 逆向知识第十讲,循环在汇编中的表现形式,以及代码还原
逆向知识第十讲,循环在汇编中的表现形式,以及代码还原 一丶do While在汇编中的表现形式 1.1高级代码: #include "stdafx.h"int main(int ar ...
- 实用防火与防爆技术培训---第十讲 可燃气体的燃爆特性
第十讲 可燃气体的燃爆特性 一.燃烧方式 气体的燃烧与液体和固体的燃烧不同,它不需要经过蒸发.熔化等过程,气体在正常状态下就可具有燃烧条件,所以比液体和固体都容易燃烧.有扩散燃烧和动力燃烧两种形式. ...
- 动手学ocr·十讲--学习笔记一
动手学ocr·十讲 技术导论 课程链接请点击这里 1.1 OCR技术背景: OCR是什么 OCR(Optical Character Recognition,光学字符识别)是计算机视觉重要方向之一.传 ...
- 《可转债入门十讲》笔记
可转债入门十讲 01.可转债基础知识(上) 定义 可转换公司债券,是指其持有者可以在一定时期内按一定比例或价格,将之转换成一定数量股票的公司债券. 预期收益 历史最高价:3618.188,历史最低价6 ...
- 初识二维码 第二十讲 二维码解码程序的组件之一 摄像头拍照功能
初识二维码 第二十讲 二维码解码程序的组件之一 摄像头拍照功能 解码程序的第一个环节是通过摄像头这个硬件,得到二维码的图片. 对摄像头的工作原理来说,简单的描述如下:1是从摄像头得到模拟信号, ...
最新文章
- idea上传项目到码云_mall前端项目的安装与部署
- Python 技术篇-python生成html源码功能实现演示,html代码自动生成技巧,列表生成式的灵活应用
- 跟着 Github 学习 Restful HTTP API 的优雅设计
- r怎么保存html文件,leaflet - 为什么在已保存的html文件中缺少传单地图上的杂项,但在Rstudio浏览器中可以正常打印呢? - 堆栈内存溢出...
- Python学习笔记--函数
- 1815. 计算两点间的距离
- vs文件上传失败--超过最大字符限制
- python渐变色代码_如何在Python中创建颜色渐变?
- 【Java】Object转换为String的三种策略总结
- 【SQL】含有NULL值的排序
- top 并grep 特定信息打印至txt
- 面试官:为什么要用 Spring?它到底解决了什么问题?
- 分簇路由算法 LEACH算法
- 图灵社区python kindle_推送mobi至Kindle流程说明(简要操作)
- .wav音乐文件转换为.fft.npy频谱格式文件
- html圆形头像简易实现
- vim 常用配置整理
- 对于踏入社会的我们来说,学历到底有多重要?学历的用途介绍
- I/O复用 —— select
- Spring系列学习之Spring Cloud Contract测试消息传递
热门文章
- javascript学习系列(19):数组中的Array.from方法
- 前端学习(3169):react-hello-react之对props进行限制
- [vue] 你了解什么是高阶组件吗?可否举个例子说明下?
- [js] 写一个方法,当给定数字位数不足8位时,则在左边补充0以补足8位数的方法
- 前端学习(2783):封装myrequest并绑定到全局
- 前端学习(2577):Nuxt解决了什么问题
- 前端学习(2244):计算器显示问题
- 前端学习(1759):前端调试值之调试安卓设备的方法
- 前端学习(1109):函数的调用
- spring mvc学习(51):jsonp