博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
IOS中关于Block的用法总结
阅读量:4110 次
发布时间:2019-05-25

本文共 1559 字,大约阅读时间需要 5 分钟。

今天整理了一下关于block的问题总结,

block 说白了就是代码块,在Swift里面叫作闭包,block 只是 Objective-C 对闭包的实现,并不是 iOS 独有的概念,在 C++、Java 等语言也有实现闭包,名称不同而已,将同一逻辑的代码放在一个块,使代码更简洁紧凑,广受开发者欢迎。但同时 block 也是 iOS比较难理解的地方,因此有必要了解下 block 的实现原理,知其然,更知其所以然,才能从根本上避免挖坑和踩坑。

block 结构体信息详解

struct __block_impl
// __block_impl 是 block 实现的结构体
 
struct __block_impl
{
void *isa;
 
int Flags;
 
int Reserved;
 
void *FuncPtr;
 
};
isa
指向实例对象,表明 block 本身也是一个 Objective-C 对象。block 的三种类型:_NSConcreteStackBlock、_NSConcreteGlobalBlock、_NSConcreteMallocBlock,即当代码执行时,isa 有三种值
impl.isa = &_NSConcreteStackBlock; 
impl.isa = &_NSConcreteMallocBlock; 
impl.isa = &_NSConcreteGlobalBlock;
Flags
按位承载 block 的附加信息;
Reserved
保留变量;
FuncPtr
函数指针,指向 Block 要执行的函数,即{ printf("Block\n") };
struct __main_block_impl_0
// __main_block_impl_0 是 block 实现的结构体,也是 block 实现的入口
 
struct __main_block_impl_0
 
{
 
struct __block_impl impl;
 
struct __main_block_desc_0* Desc;
 
__main_block_impl_0(void *fp, struct __main_block_desc_0 *desc, int flags=0)
 
{
 
impl.isa = &_NSConcreteStackBlock;
 
impl.Flags = flags;
 
impl.FuncPtr = fp;
 
Desc = desc;
 
}
 
};
impl
block 实现的结构体变量,该结构体前面已说明;
Desc
描述 block 的结构体变量;
__main_block_impl_0
结构体的构造函数,初始化结构体变量 impl、Desc;

了解了block的结构体,我么来说说具体的用法

1. 最常用的用法就是访问外部变量:

1).block以const 的方式copy 外部变量,将变量从栈区考到堆区,内部可以访问但是不允许修改外部变量值
2)   .如果在block定义变量,将保存到栈区,如果与外部变量重名,将屏蔽外部变量
3).如果一定要修改外部变量,在外部变量前面加__block, 这时block将不再以const的方式拷贝到堆区
4).当外部变量以__block修饰,在block内部被修改后,执行完block后,访问的都是堆区的空间,不再是栈区的空间
5).当访问全局变量,block可以访问并且可以直接修改,全局变量不需要加__block
6).  ARC模式下,循环引用要加__weak, MRC模式下要加__Block
2. 开发中如果需要传值,block也是经常的选择,注意在传值的时候的循环引用问题
后续还将继续讨论block,如果有错误,请大神指出

转载地址:http://yrmsi.baihongyu.com/

你可能感兴趣的文章
git中文安装教程
查看>>
虚拟机 CentOS7/RedHat7/OracleLinux7 配置静态IP地址 Ping 物理机和互联网
查看>>
弱类型、强类型、动态类型、静态类型语言的区别是什么?
查看>>
Struts2技术内幕图书 转载
查看>>
Java异常分类
查看>>
项目中的jackson与json-lib使用比较
查看>>
Jackson Tree Model Example
查看>>
j2ee-验证码
查看>>
日志框架logj的使用
查看>>
js-高德地图规划路线
查看>>
常用js收集
查看>>
mydata97的日期控件
查看>>
如何防止sql注入
查看>>
maven多工程构建与打包
查看>>
springmvc传值
查看>>
Java 集合学习一 HashSet
查看>>
在Eclipse中查看Android源码
查看>>
Android-Socket登录实例
查看>>
Android使用webservice客户端实例
查看>>
层在页面中的定位
查看>>