学习block - iOS
一、block
1、block分类:NSGlobalBlock,NSMallocBlock,NSStackBlock
三种block各自的存储域如下图:
- _NSConcreteGlobalBlock 全局的静态 block,不会访问任何外部变量。
- _NSConcreteStackBlock 保存在栈中的 block,当函数返回时会被销毁。
- _NSConcreteMallocBlock 保存在堆中的 block,当引用计数为 0 时会被销毁
2、block特性:
a、捕获外部变量
int a = 10;
void (^block)(void) = ^{NSLog(@"a的值 - %d",a);
};a = 2;
block();
输出结果如下:
通过结果发现,a = 10,而不会a = 2,可以知道默认情况下block只能访问,不能修改局部变量的值。
那我们如何输出a = 2;呢?
通过使用__block修饰外部变量,代码如下:
__block int a = 10;
void (^block)(void) = ^{NSLog(@"a的值 - %d",a);
};
a = 2;
block();
结果如下:
为什么使用__block修饰的外部变量的值就可以被block修改呢? 我们使用clang将代码转换为C++文件发现。 没有加__block 的结构体:
struct __main_block_impl_0 {struct __block_impl impl;struct __main_block_desc_0* Desc;int a;__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int _a, int flags=0) : a(_a) {impl.isa = &_NSConcreteStackBlock;impl.Flags = flags;impl.FuncPtr = fp;Desc = desc;}
};
增加了__block的结构体:
struct __main_block_impl_0 {struct __block_impl impl;struct __main_block_desc_0* Desc;__Block_byref_a_0 *a; // by ref__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, __Block_byref_a_0 *_a, int flags=0) : a(_a->__forwarding) {impl.isa = &_NSConcreteStackBlock;impl.Flags = flags;impl.FuncPtr = fp;Desc = desc;}
};
我们发现了局部变量a加上__block修饰符跟block一样变成了一个__Block_byref_a_0结构体类型的自动变量实例。然后我们会使用一个__forwarding成员变量来间接的访问a变量。
b、匿名函数 -- 保存代码块 -- 非常灵活(但是嵌套层非常深,不建议使用block,因为代码调试复杂,不便于直观性)
3、block的定义与使用
a、无参数无返回值
void (^blockOne)(void) = ^(void) {NSLog(@"无参数无返回值");
};
blockOne();
b、有参数,无返回值
void (^blockTwo)(int a) = ^(int a) {NSLog(@"@ = %d我就是block,有参数,无返回值",a);
};
blockTwo(100);
c、有参数,有返回值
int (^blockThree)(int,int) = ^(int a,int b) {NSLog(@"@ = %d我就是block,有参数,有返回值",a+b);return a+b;
};
blockThree(5,10);
d、无参数,有返回值
int (^blockFour)(void) = ^(void) {NSLog(@"无参数,有返回值");return 3;
};
blockFour();
e、实际开发应用,常常用typedef定义block
用typedef定义一个block:
typedef int (^blockThree)(int,int) ;
这时,blockThree就成为了一种block类型,在定义类的属性时:
@property (nonatomic, copy) blockThree myblock;
使用时:
self.myblock = ^int (int, int);
学习block - iOS相关推荐
- GitHub 上都有哪些值得关注学习的 iOS 开源项目?
GitHub 上都有哪些值得关注学习的 iOS 开源项目?修改 如果仅按照 GitHub 月流行查看 Objective-C 项目的话有 ── Trending Objective-C reposit ...
- iOS学习之iOS沙盒(sandbox)机制和文件操作(二)
接上篇 iOS学习之iOS沙盒(sandbox)机制和文件操作(一) 我们看看如何获取应用程序沙盒目录.包括真机的沙盒的目录. 1.获取程序的Home目录 [cpp] view plaincopy N ...
- iOS开发-由浅至深学习block
作者:Sindri的小巢(简书) 关于block 在iOS 4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调.这不免让我们想到在C函数中,我们 ...
- iOS学习——获取iOS设备的各种信息
不管是在Android开发还是iOS开发过程中,有时候我们需要经常根据设备的一些状态或信息进行不同的设置和性能配置,例如横竖屏切换时,电池电量低时,内存不够时,网络切换时等等,我们在这时候需要进行一些 ...
- 学习多线程 - iOS
实现多线程的方案一共有四种:pthread,NSThread,GCD,NSOperation 一.线程的状态与生命周期 新建:实例化线程对象 就绪:向线程对象发送start消息,线程对象就被加入到可调 ...
- iOS学习之iOS沙盒(sandbox)机制和文件操作复习
1.iOS沙盒机制 iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. ...
- ruby学习--block
1 #当前块 2 class Block 3 def a_method 4 return yield if block_given? 5 'no block' 6 end 7 end 8 obj=Bl ...
- iOS学习之iOS沙盒(sandbox)机制和文件操作(一)
1.iOS沙盒机制 iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. ...
- 从零开始搭建一个艺术风格(深度学习)转换ios app
目前市场上关于带艺术风格转换的功能的IOS app为 1严肃艺术的Becasso. 2专注少女自拍的美图秀秀 3还有各类 电影风格转换app 比如前阵子的朋友圈上疯狂分析 <<你的名字&g ...
最新文章
- js base64 解码
- 妈呀!GitChat 发布 1.9 版本更新公告,这个红色简直亮瞎了我的眼...
- 扩增子图片解读7三元图:美的不要不要的,再多用也不过分
- Exchange 2010 EMC 删除 DisconnectedMailbox
- shell-init: error
- json例子(后台取消息)
- BZOJ4671: 异或图
- MySQL 时间类型 DATE、DATETIME和TIMESTAMP
- 为什么大多Virtual Globe程序纵向旋转效率比较低
- C#基础知识整理:基础知识(1) Main方法
- 查看win10剩余激活时间
- 如何查看linux命令源代码(转自网络)
- 配置python开发环境搭建_Eclipse配置Python开发环境
- 具有动态效果的响应式设计
- FJUT 2351 T^T的图论(并查集)
- Redis学习笔记(四)——数据结构之List
- 不光荣的“革命”——“甘露之变”后的晚唐政治
- Pymol教程--Caver插件 研究蛋白通道
- chrome 截长图功能
- RESTful 架构介绍