IOS中关于Block的用法总结

今天整理了一下关于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,如果有错误,请大神指出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值