ios学习笔记——Block块小结
一、块的基础知识
块与函数类似。尤其跟函数指针非常相思,用法也大同小异。
块的语法结构如下:
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块小结相关推荐
- ios学习笔记block回调的应用(一个简单的例子)
一.什么是Blocks Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block. 二 ...
- OpenCV for Ios 学习笔记(4)-标记检测1
本文原始地址:OpenCV for Ios 学习笔记(4)-标记检测1 简单的标记经常是以白色块和黑色块构成的规则图形.因为我们预先知道这些因素,所以我们可以很容易检测标记. 如图: 首先,我们需要找 ...
- iOS学习笔记-自己动手写RESideMenu
代码地址如下: http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars ...
- IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法...
IOS学习笔记(九)之UIAlertView(警告视图)和UIActionSheet(操作表视图)基本概念和使用方法 Author:hmjiangqq Email:jiangqqlmj@163.com ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- iOS学习笔记-地图MapKit入门
代码地址如下: http://www.demodashi.com/demo/11682.html 这篇文章还是翻译自raywenderlich,用Objective-C改写了代码.没有逐字翻译,如有错 ...
- iOS学习笔记-自定义过渡动画
代码地址如下: http://www.demodashi.com/demo/11678.html 这篇笔记翻译自raywenderlick网站的过渡动画的一篇文章,原文用的swift,由于考虑到swi ...
- IOS学习笔记07---C语言函数-scanf函数
2013/8/7 IOS学习笔记07---C语言函数-scanf函数 ------------------------------ qq交流群:创梦技术交流群:251572072 ...
- IOS学习笔记07---C语言函数-printf函数
IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...
最新文章
- 向量、矩阵的范数--Lp定义
- android 悬浮窗权限,Android 悬浮窗权限校验
- 【控制】《多智能体机器人系统信息融合与协调》范波老师-第7章-基于 Markov 对策的多 Agent 协调
- 工程优化作业——成功失败法和黄金分割法
- linux 优雅重启进程,apache2 重启、停止、优雅重启、优雅停止
- 修改kubelet启动参数
- 应用id_科普贴:什么是OpenID、AppID 、用户ID等各种ID?
- CString的成员函数用法大全
- linux切换中文拼音快捷键,Fedora 16下调出中文拼音输入法
- React 环境 webpack less 配置 及 javascriptEnabled 解决方法
- git is outside repository
- 高通平台 pmic—gpio修改(一)
- QuerySet,本质上是一个给定的模型的对象列表
- C++线性表(单链表)的应用算法(附源码)
- 展锐哪些芯片支持伽利略Galileo定位系统
- Springboot-软件授权License
- 基于spark的车辆分析
- vscode终端无输出
- 解决windows服务器装虚拟机windows系统无网络连接网络
- ckeditor4 +Wiris MathType + Mathjax 渲染 + Tax 公式编辑