Block
一:结构相关
Block是一个包含了上下文变量的对象,该对象包含了_block_impl结构体,上下文变量同类型的成员变量(block函数体内用到的,加上了 _block修饰符),以及一个Desc结构体(可不关注)。在定义block时,调用了该对象的构造函数, __block_impl 中的isa指针标明其为一个对象,(值可为 NSGlobalBlock, NSStackBlock, NSMallocBlock中的一种),block函数体被封装成一个函数,并由__block_imp->FuncPtr所指向,上下文变量也作为参数传入构造函数。
二:内存相关
- MRC下,若block函数体中包含了上下文变量,默认创建的是stack类型的block,因此需要用copy将其拷贝到堆上(构造一个MallocBlock),放在因退栈而被释放;若无上下文变量,则为GlocalBlock.
- ARC下, 默认创建的MallocBlock,因此无需copy修饰, strong即可。
参考:
https://blog.csdn.net/abc649395594/article/details/47086751
https://blog.csdn.net/Deft_MKJing/article/details/78582933
网友评论