一、块的基础知识


块与函数类似。尤其跟函数指针非常相思,用法也大同小异。

块的语法结构如下:

return_type  (^block_name)(parameters)

返回类型    块名称    参数

1     //定义块
2     int (^sjzBlock)(int a, int b) = ^(int a, int b){
3         return a + b;
4     };
5     //使用块
6     int c = sjzBlock(1, 2);

在声明块的范围内,所有变量都可以为其所捕获。但是不能修改变量,如果想要修改,可以在声明变量的时候加上__block修饰符。

 1     //在块里修改e的值,报错
 2     int e = 100;
 3     //加上__block修饰符,可以修改d的值
 4     __block int d = 10;
 5     int (^sjzBlock)(int a, int b) = ^(int a, int b){
 6         d = 12;
 7 //        e = 90;  //报错
 8         return a + b;
 9     };
10     int c = sjzBlock(1, 2);
11     NSLog(@"c = %d  d = %d", c, d);

输出结果:

块本身也是一个对象,也有引用计数。

如果块所捕获的变量是对象类型,那么就会自动保留它。系统在释放这个块的时候,也会将其一并释放。

块可以访问类的所有实例变量,块能够修改实例变量,所以在声明实例变量时,无需加__block。如果通过读取或写入操作捕获实例变量,那么也会自动把self变量一并捕获了,因为实例变量是与self所只带的实例关联在一起的。当块保留self的时候,很可能self也保留了块,容易造成循环引用。

 1 #import "ViewController.h"
 2
 3 @interface ViewController ()
 4
 5 @property (nonatomic, strong) NSString * sjzStr;
 6
 7 @end
 8
 9 @implementation ViewController
10
11 - (void)viewDidLoad {
12     [super viewDidLoad];
13
14     [self blockText];
15 }
16
17 - (void)blockText
18 {
19     void (^sjzBlock)(int a, int b) = ^(int a, int b){
20         //以下这两种调用,都会将会捕获self
21 //        _sjzStr = @"Hello, world";
22         self.sjzStr = @"hello, world";
23         NSLog(@"%@", _sjzStr);
24     };
25
26     sjzBlock(1, 2);
27 }
28
29 @end

块的内部结构


这里面,最重要的是invoke变量,是一个函数指针,指向块的实现代码。至少接受一个void*类型的参数,此参数代表块本身。

descriptor变量是指向结构体的指针,每个块都包含改结构体。声明了块的总体大小,copy函数指针保留捕获的对象,dispose当块释放时,释放捕获的对象。

块会把它捕获的对象全部拷贝一份,捕获了多少对象,就要占据多少内存空间。

转载于:https://www.cnblogs.com/sjzlovecj/p/5261043.html

ios学习笔记——Block块小结相关推荐

  1. ios学习笔记block回调的应用(一个简单的例子)

    一.什么是Blocks       Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block. 二 ...

  2. OpenCV for Ios 学习笔记(4)-标记检测1

    本文原始地址:OpenCV for Ios 学习笔记(4)-标记检测1 简单的标记经常是以白色块和黑色块构成的规则图形.因为我们预先知道这些因素,所以我们可以很容易检测标记. 如图: 首先,我们需要找 ...

  3. iOS学习笔记-自己动手写RESideMenu

    代码地址如下: http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars ...

  4. IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法...

    IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法 Author:hmjiangqq Email:jiangqqlmj@163.com ...

  5. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  6. iOS学习笔记-地图MapKit入门

    代码地址如下: http://www.demodashi.com/demo/11682.html 这篇文章还是翻译自raywenderlich,用Objective-C改写了代码.没有逐字翻译,如有错 ...

  7. iOS学习笔记-自定义过渡动画

    代码地址如下: http://www.demodashi.com/demo/11678.html 这篇笔记翻译自raywenderlick网站的过渡动画的一篇文章,原文用的swift,由于考虑到swi ...

  8. IOS学习笔记07---C语言函数-scanf函数

    2013/8/7 IOS学习笔记07---C语言函数-scanf函数 ------------------------------ qq交流群:创梦技术交流群:251572072            ...

  9. IOS学习笔记07---C语言函数-printf函数

    IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...

最新文章

  1. 向量、矩阵的范数--Lp定义
  2. android 悬浮窗权限,Android 悬浮窗权限校验
  3. 【控制】《多智能体机器人系统信息融合与协调》范波老师-第7章-基于 Markov 对策的多 Agent 协调
  4. 工程优化作业——成功失败法和黄金分割法
  5. linux 优雅重启进程,apache2 重启、停止、优雅重启、优雅停止
  6. 修改kubelet启动参数
  7. 应用id_科普贴:什么是OpenID、AppID 、用户ID等各种ID?
  8. CString的成员函数用法大全
  9. linux切换中文拼音快捷键,Fedora 16下调出中文拼音输入法
  10. React 环境 webpack less 配置 及 javascriptEnabled 解决方法
  11. git is outside repository
  12. 高通平台 pmic—gpio修改(一)
  13. QuerySet,本质上是一个给定的模型的对象列表
  14. C++线性表(单链表)的应用算法(附源码)
  15. 展锐哪些芯片支持伽利略Galileo定位系统
  16. Springboot-软件授权License
  17. 基于spark的车辆分析
  18. vscode终端无输出
  19. 解决windows服务器装虚拟机windows系统无网络连接网络
  20. ckeditor4 +Wiris MathType + Mathjax 渲染 + Tax 公式编辑

热门文章

  1. Socket通信原理探讨(C++为例)
  2. php简单创建多级目录
  3. 黑苹果安装 this is an unknown cpu model 0x3a
  4. 我能使用这个Intent吗?
  5. SPSiteManager 2.3可以下载了
  6. mysql备份slave_MySQL主(Master)从(Slave)备份;
  7. 让 typora和word一样好用
  8. C++实现删除字符串中所有重复出现的字符
  9. 关于STM32的变量定义
  10. 遗传算法就是创造力的本质